Skip to content

Commit 5473192

Browse files
rcohjdisanti
andauthored
Update runtime plugin trait (#2754)
## Motivation and Context Update the RuntimePlugin trait based on discussion: 1. Methods are infallible 2. Split out `Config` and `Interceptors` 3. `ConfigBag` now has an explicit field `interceptor_state` 4. Refactor `ConfigBagAccessors` so that we can build the core around the trait and keep the trait together with a `where Self` trick ## Description - Update the `RuntimePlugin` trait - Deal with resulting implications ## Testing - [x] 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: John DiSanti <jdisanti@amazon.com>
1 parent 8e37d42 commit 5473192

File tree

44 files changed

+659
-505
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+659
-505
lines changed

aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use aws_smithy_runtime_api::client::interceptors::{
1414
BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, BoxError,
1515
Interceptor,
1616
};
17-
use aws_smithy_runtime_api::client::orchestrator::LoadedRequestBody;
17+
use aws_smithy_runtime_api::client::orchestrator::{ConfigBagAccessors, LoadedRequestBody};
1818
use aws_smithy_types::config_bag::ConfigBag;
1919
use bytes::Bytes;
2020
use http::header::{HeaderName, HeaderValue};
@@ -119,7 +119,8 @@ impl Interceptor for GlacierTreeHashHeaderInterceptor {
119119
) -> Result<(), BoxError> {
120120
// Request the request body to be loaded into memory immediately after serialization
121121
// so that it can be checksummed before signing and transmit
122-
cfg.put(LoadedRequestBody::Requested);
122+
cfg.interceptor_state()
123+
.set_loaded_request_body(LoadedRequestBody::Requested);
123124
Ok(())
124125
}
125126

@@ -139,7 +140,7 @@ impl Interceptor for GlacierTreeHashHeaderInterceptor {
139140
.clone();
140141
signing_config.signing_options.payload_override =
141142
Some(SignableBody::Precomputed(content_sha256));
142-
cfg.put(signing_config);
143+
cfg.interceptor_state().put(signing_config);
143144
} else {
144145
return Err(
145146
"the request body wasn't loaded into memory before the retry loop, \

aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use aws_smithy_runtime_api::client::interceptors::{
1919
};
2020
use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors;
2121
use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;
22-
use aws_smithy_types::config_bag::ConfigBag;
22+
use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};
2323

2424
/// Interceptor that tells the SigV4 signer to add the signature to query params,
2525
/// and sets the request expiration time from the presigning config.
@@ -40,14 +40,15 @@ impl Interceptor for SigV4PresigningInterceptor {
4040
_context: &mut BeforeSerializationInterceptorContextMut<'_>,
4141
cfg: &mut ConfigBag,
4242
) -> Result<(), BoxError> {
43-
cfg.put::<HeaderSerializationSettings>(
43+
cfg.interceptor_state().put::<HeaderSerializationSettings>(
4444
HeaderSerializationSettings::new()
4545
.omit_default_content_length()
4646
.omit_default_content_type(),
4747
);
48-
cfg.set_request_time(SharedTimeSource::new(StaticTimeSource::new(
49-
self.config.start_time(),
50-
)));
48+
cfg.interceptor_state()
49+
.set_request_time(SharedTimeSource::new(StaticTimeSource::new(
50+
self.config.start_time(),
51+
)));
5152
Ok(())
5253
}
5354

@@ -61,7 +62,8 @@ impl Interceptor for SigV4PresigningInterceptor {
6162
config.signing_options.signature_type = HttpSignatureType::HttpRequestQueryParams;
6263
config.signing_options.payload_override =
6364
Some(aws_sigv4::http_request::SignableBody::UnsignedPayload);
64-
cfg.put::<SigV4OperationSigningConfig>(config);
65+
cfg.interceptor_state()
66+
.put::<SigV4OperationSigningConfig>(config);
6567
Ok(())
6668
} else {
6769
Err(
@@ -87,18 +89,15 @@ impl SigV4PresigningRuntimePlugin {
8789
}
8890

8991
impl RuntimePlugin for SigV4PresigningRuntimePlugin {
90-
fn configure(
91-
&self,
92-
cfg: &mut ConfigBag,
93-
interceptors: &mut InterceptorRegistrar,
94-
) -> Result<(), BoxError> {
95-
// Disable some SDK interceptors that shouldn't run for presigning
96-
cfg.put(disable_interceptor::<InvocationIdInterceptor>("presigning"));
97-
cfg.put(disable_interceptor::<RequestInfoInterceptor>("presigning"));
98-
cfg.put(disable_interceptor::<UserAgentInterceptor>("presigning"));
92+
fn config(&self) -> Option<FrozenLayer> {
93+
let mut layer = Layer::new("Presigning");
94+
layer.put(disable_interceptor::<InvocationIdInterceptor>("presigning"));
95+
layer.put(disable_interceptor::<RequestInfoInterceptor>("presigning"));
96+
layer.put(disable_interceptor::<UserAgentInterceptor>("presigning"));
97+
Some(layer.freeze())
98+
}
9999

100-
// Register the presigning interceptor
100+
fn interceptors(&self, interceptors: &mut InterceptorRegistrar) {
101101
interceptors.register(self.interceptor.clone());
102-
Ok(())
103102
}
104103
}

aws/rust-runtime/aws-runtime/src/auth/sigv4.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ mod tests {
506506
use super::*;
507507
use aws_credential_types::Credentials;
508508
use aws_sigv4::http_request::SigningSettings;
509+
use aws_smithy_types::config_bag::Layer;
509510
use aws_types::region::SigningRegion;
510511
use aws_types::SigningService;
511512
use std::collections::HashMap;
@@ -556,8 +557,8 @@ mod tests {
556557

557558
#[test]
558559
fn endpoint_config_overrides_region_and_service() {
559-
let mut cfg = ConfigBag::base();
560-
cfg.put(SigV4OperationSigningConfig {
560+
let mut layer = Layer::new("test");
561+
layer.put(SigV4OperationSigningConfig {
561562
region: Some(SigningRegion::from(Region::new("override-this-region"))),
562563
service: Some(SigningService::from_static("override-this-service")),
563564
signing_options: Default::default(),
@@ -577,6 +578,7 @@ mod tests {
577578
});
578579
let config = AuthSchemeEndpointConfig::new(Some(&config));
579580

581+
let cfg = ConfigBag::of_layers(vec![layer]);
580582
let result =
581583
SigV4HttpRequestSigner::extract_operation_config(config, &cfg).expect("success");
582584

@@ -593,12 +595,13 @@ mod tests {
593595

594596
#[test]
595597
fn endpoint_config_supports_fallback_when_region_or_service_are_unset() {
596-
let mut cfg = ConfigBag::base();
597-
cfg.put(SigV4OperationSigningConfig {
598+
let mut layer = Layer::new("test");
599+
layer.put(SigV4OperationSigningConfig {
598600
region: Some(SigningRegion::from(Region::new("us-east-1"))),
599601
service: Some(SigningService::from_static("qldb")),
600602
signing_options: Default::default(),
601603
});
604+
let cfg = ConfigBag::of_layers(vec![layer]);
602605
let config = AuthSchemeEndpointConfig::empty();
603606

604607
let result =

aws/rust-runtime/aws-runtime/src/invocation_id.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ impl Interceptor for InvocationIdInterceptor {
4848
.map(|gen| gen.generate())
4949
.transpose()?
5050
.flatten();
51-
cfg.put::<InvocationId>(id.unwrap_or_default());
51+
cfg.interceptor_state()
52+
.put::<InvocationId>(id.unwrap_or_default());
5253

5354
Ok(())
5455
}

aws/rust-runtime/aws-runtime/src/request_info.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ mod tests {
166166
use crate::request_info::RequestPairs;
167167
use aws_smithy_http::body::SdkBody;
168168
use aws_smithy_runtime_api::client::interceptors::{Interceptor, InterceptorContext};
169-
use aws_smithy_types::config_bag::ConfigBag;
169+
use aws_smithy_types::config_bag::{ConfigBag, Layer};
170170
use aws_smithy_types::retry::RetryConfig;
171171
use aws_smithy_types::timeout::TimeoutConfig;
172172
use aws_smithy_types::type_erasure::TypeErasedBox;
@@ -190,13 +190,14 @@ mod tests {
190190
context.enter_serialization_phase();
191191
context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap());
192192

193-
let mut config = ConfigBag::base();
194-
config.put(RetryConfig::standard());
195-
config.put(
193+
let mut layer = Layer::new("test");
194+
layer.put(RetryConfig::standard());
195+
layer.put(
196196
TimeoutConfig::builder()
197197
.read_timeout(Duration::from_secs(30))
198198
.build(),
199199
);
200+
let mut config = ConfigBag::of_layers(vec![layer]);
200201

201202
let _ = context.take_input();
202203
context.enter_before_transmit_phase();

aws/rust-runtime/aws-runtime/src/user_agent.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ mod tests {
110110
use super::*;
111111
use aws_smithy_http::body::SdkBody;
112112
use aws_smithy_runtime_api::client::interceptors::{Interceptor, InterceptorContext};
113-
use aws_smithy_types::config_bag::ConfigBag;
113+
use aws_smithy_types::config_bag::{ConfigBag, Layer};
114114
use aws_smithy_types::error::display::DisplayErrorContext;
115115
use aws_smithy_types::type_erasure::TypeErasedBox;
116116

@@ -138,14 +138,15 @@ mod tests {
138138
fn test_overridden_ua() {
139139
let mut context = context();
140140

141-
let mut config = ConfigBag::base();
142-
config.put(AwsUserAgent::for_tests());
143-
config.put(ApiMetadata::new("unused", "unused"));
141+
let mut layer = Layer::new("test");
142+
layer.put(AwsUserAgent::for_tests());
143+
layer.put(ApiMetadata::new("unused", "unused"));
144+
let mut cfg = ConfigBag::of_layers(vec![layer]);
144145

145146
let interceptor = UserAgentInterceptor::new();
146147
let mut ctx = Into::into(&mut context);
147148
interceptor
148-
.modify_before_signing(&mut ctx, &mut config)
149+
.modify_before_signing(&mut ctx, &mut cfg)
149150
.unwrap();
150151

151152
let header = expect_header(&context, "user-agent");
@@ -163,8 +164,9 @@ mod tests {
163164
let mut context = context();
164165

165166
let api_metadata = ApiMetadata::new("some-service", "some-version");
166-
let mut config = ConfigBag::base();
167-
config.put(api_metadata.clone());
167+
let mut layer = Layer::new("test");
168+
layer.put(api_metadata.clone());
169+
let mut config = ConfigBag::of_layers(vec![layer]);
168170

169171
let interceptor = UserAgentInterceptor::new();
170172
let mut ctx = Into::into(&mut context);
@@ -192,9 +194,10 @@ mod tests {
192194
let mut context = context();
193195

194196
let api_metadata = ApiMetadata::new("some-service", "some-version");
195-
let mut config = ConfigBag::base();
196-
config.put(api_metadata);
197-
config.put(AppName::new("my_awesome_app").unwrap());
197+
let mut layer = Layer::new("test");
198+
layer.put(api_metadata);
199+
layer.put(AppName::new("my_awesome_app").unwrap());
200+
let mut config = ConfigBag::of_layers(vec![layer]);
198201

199202
let interceptor = UserAgentInterceptor::new();
200203
let mut ctx = Into::into(&mut context);

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) :
4747
pub fn request_time_for_tests(mut self, request_time: ::std::time::SystemTime) -> Self {
4848
use #{ConfigBagAccessors};
4949
let interceptor = #{TestParamsSetterInterceptor}::new(move |_: &mut #{BeforeTransmitInterceptorContextMut}<'_>, cfg: &mut #{ConfigBag}| {
50-
cfg.set_request_time(#{SharedTimeSource}::new(request_time));
50+
cfg.interceptor_state().set_request_time(#{SharedTimeSource}::new(request_time));
5151
});
5252
self.interceptors.push(#{SharedInterceptor}::new(interceptor));
5353
self

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ private class InvocationIdRuntimePluginCustomization(
3636
)
3737

3838
override fun section(section: ServiceRuntimePluginSection): Writable = writable {
39-
if (section is ServiceRuntimePluginSection.AdditionalConfig) {
39+
if (section is ServiceRuntimePluginSection.RegisterInterceptor) {
4040
section.registerInterceptor(codegenContext.runtimeConfig, this) {
4141
rustTemplate("#{InvocationIdInterceptor}::new()", *codegenScope)
4242
}

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private class RecursionDetectionRuntimePluginCustomization(
3131
private val codegenContext: ClientCodegenContext,
3232
) : ServiceRuntimePluginCustomization() {
3333
override fun section(section: ServiceRuntimePluginSection): Writable = writable {
34-
if (section is ServiceRuntimePluginSection.AdditionalConfig) {
34+
if (section is ServiceRuntimePluginSection.RegisterInterceptor) {
3535
section.registerInterceptor(codegenContext.runtimeConfig, this) {
3636
rust(
3737
"#T::new()",

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodege
3535
private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)
3636

3737
override fun section(section: ServiceRuntimePluginSection): Writable = writable {
38-
if (section is ServiceRuntimePluginSection.AdditionalConfig) {
38+
if (section is ServiceRuntimePluginSection.RegisterInterceptor) {
3939
// Track the latency between client and server.
4040
section.registerInterceptor(runtimeConfig, this) {
4141
rust(

0 commit comments

Comments
 (0)