diff --git a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AddAwsConfigFields.java b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AddAwsConfigFields.java index dc48b288212..1c541b2b4cd 100644 --- a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AddAwsConfigFields.java +++ b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AddAwsConfigFields.java @@ -222,11 +222,23 @@ private void writeAwsConfigConstructor(Model model, ServiceShape service, GoWrit } }); - for (AwsConfigField field : AWS_CONFIG_FIELDS) { + + List configFields = new ArrayList<>(AWS_CONFIG_FIELDS); + // add client specific config fields + for (AwsConfigField cfgField: ResolveClientConfig.AWS_CONFIG_FIELDS) { + configFields.add(cfgField); + } + + for (AwsConfigField field : configFields) { Optional awsResolverFunction = field.getAwsResolverFunction(); if (!awsResolverFunction.isPresent()) { continue; } + if (field.getServicePredicate().isPresent()) { + if (!field.getServicePredicate().get().test(model, service)) { + continue; + } + } writer.write("$L(cfg, &opts)", awsResolverFunction.get()); } diff --git a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AwsGoDependency.java b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AwsGoDependency.java index 915343b1c3b..baaa747d00e 100644 --- a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AwsGoDependency.java +++ b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AwsGoDependency.java @@ -34,6 +34,8 @@ public class AwsGoDependency { public static final GoDependency AWS_HTTP_TRANSPORT = aws("aws/transport/http", "awshttp"); public static final GoDependency AWSTESTING_UNIT = aws("internal/awstesting/unit"); + public static final GoDependency S3_SHARED_CONFIG = aws("service/internal/s3shared/config", "s3sharedconfig"); + public static final GoDependency REGEXP = SmithyGoDependency.stdlib("regexp"); public static final String AWS_SOURCE_PATH = "github.com/aws/aws-sdk-go-v2"; @@ -82,6 +84,6 @@ protected static GoDependency module( } private static final class Versions { - private static final String AWS_SDK = "v0.30.1-0.20201217001905-4acf9c65b2d1"; + private static final String AWS_SDK = "v0.30.1-0.20201221101722-677dd4a81dad"; } } diff --git a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/ResolveClientConfig.java b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/ResolveClientConfig.java new file mode 100644 index 00000000000..436547c50a3 --- /dev/null +++ b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/ResolveClientConfig.java @@ -0,0 +1,96 @@ +package software.amazon.smithy.aws.go.codegen; + +import java.util.List; +import java.util.logging.Logger; +import software.amazon.smithy.aws.traits.ServiceTrait; +import software.amazon.smithy.codegen.core.Symbol; +import software.amazon.smithy.codegen.core.SymbolProvider; +import software.amazon.smithy.go.codegen.GoDelegator; +import software.amazon.smithy.go.codegen.GoSettings; +import software.amazon.smithy.go.codegen.SmithyGoDependency; +import software.amazon.smithy.go.codegen.SymbolUtils; +import software.amazon.smithy.go.codegen.integration.GoIntegration; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.utils.ListUtils; + +/** + * Registers additional client specific configuration fields + */ +public class ResolveClientConfig implements GoIntegration { + private static final Logger LOGGER = Logger.getLogger(AddAwsConfigFields.class.getName()); + + private static final String USE_ARN_REGION_OPTION = "UseARNRegion"; + private static final String CLIENT_CONFIG_RESOLVER_FUNC = "resolveClientConfig"; + private static final String CONFIG_SOURCE_CONFIG_NAME = "ConfigSources"; + private static final String RESOLVE_USE_ARN_REGION= "ResolveUseARNRegion"; + + public static final List AWS_CONFIG_FIELDS = ListUtils.of( + AddAwsConfigFields.AwsConfigField.builder() + .name(USE_ARN_REGION_OPTION) + .type(getUniversalSymbol("boolean")) + .generatedOnClient(false) + .servicePredicate((model, serviceShape) -> { + return isS3SharedService(model, serviceShape); + }) + .awsResolveFunction(SymbolUtils.createValueSymbolBuilder(CLIENT_CONFIG_RESOLVER_FUNC) + .build()) + .build() + ); + + @Override + public void writeAdditionalFiles( + GoSettings settings, + Model model, + SymbolProvider symbolProvider, + GoDelegator goDelegator + ) { + LOGGER.info("generating client config resolver"); + ServiceShape serviceShape = settings.getService(model); + goDelegator.useShapeWriter(serviceShape, writer -> { + if (!isS3SharedService(model, serviceShape)) { + return; + } + + writer.writeDocs("resolves client config"); + writer.addUseImports(AwsGoDependency.AWS_CORE); + writer.openBlock("func $L(cfg aws.Config, o *Options) error {", "}", + CLIENT_CONFIG_RESOLVER_FUNC, () -> { + writer.openBlock("if len(cfg.$L) == 0 {", "}", + CONFIG_SOURCE_CONFIG_NAME, + () -> writer.write("return nil") + ); + + writer.addUseImports(SmithyGoDependency.CONTEXT); + Symbol resolverFunc = SymbolUtils.createValueSymbolBuilder(RESOLVE_USE_ARN_REGION, + AwsGoDependency.S3_SHARED_CONFIG).build(); + writer.write("value, found, err := $T(context.Background(), cfg.$L)", resolverFunc, + CONFIG_SOURCE_CONFIG_NAME); + writer.write("if err != nil { return err }"); + writer.write("if found { o.$L = value }", USE_ARN_REGION_OPTION); + + writer.write("return nil"); + }); + + }); + } + + + private static Symbol getUniversalSymbol(String symbolName) { + return SymbolUtils.createValueSymbolBuilder(symbolName) + .putProperty(SymbolUtils.GO_UNIVERSE_TYPE, true).build(); + } + + private static boolean isS3SharedService(Model model, ServiceShape service) { + return isS3Service(model, service) || isS3ControlService(model, service); + } + + private static boolean isS3Service(Model model, ServiceShape service) { + return service.expectTrait(ServiceTrait.class).getSdkId().equalsIgnoreCase("S3"); + } + + private static boolean isS3ControlService(Model model, ServiceShape service) { + return service.expectTrait(ServiceTrait.class).getSdkId().equalsIgnoreCase("S3 Control"); + } + +} diff --git a/codegen/smithy-aws-go-codegen/src/main/resources/META-INF/services/software.amazon.smithy.go.codegen.integration.GoIntegration b/codegen/smithy-aws-go-codegen/src/main/resources/META-INF/services/software.amazon.smithy.go.codegen.integration.GoIntegration index c50b64f8c50..7f26e7341e2 100644 --- a/codegen/smithy-aws-go-codegen/src/main/resources/META-INF/services/software.amazon.smithy.go.codegen.integration.GoIntegration +++ b/codegen/smithy-aws-go-codegen/src/main/resources/META-INF/services/software.amazon.smithy.go.codegen.integration.GoIntegration @@ -32,3 +32,4 @@ software.amazon.smithy.aws.go.codegen.FilterStreamingOperations software.amazon.smithy.aws.go.codegen.RequestResponseLogging software.amazon.smithy.aws.go.codegen.customization.S3ControlEndpointResolver software.amazon.smithy.aws.go.codegen.AwsHttpPresignURLClientGenerator +software.amazon.smithy.aws.go.codegen.ResolveClientConfig diff --git a/config/shared_config.go b/config/shared_config.go index 6225b464b5d..24b819e6723 100644 --- a/config/shared_config.go +++ b/config/shared_config.go @@ -130,7 +130,7 @@ type SharedConfig struct { // GetS3UseARNRegion returns if the S3 service should allow ARNs to direct the region // the client's requests are sent to. -func (c *SharedConfig) GetS3UseARNRegion(ctx context.Context) (value, ok bool, err error) { +func (c SharedConfig) GetS3UseARNRegion(ctx context.Context) (value, ok bool, err error) { if c.S3UseARNRegion == nil { return false, false, nil } diff --git a/service/s3/internal/config/config.go b/service/internal/s3shared/config/config.go similarity index 100% rename from service/s3/internal/config/config.go rename to service/internal/s3shared/config/config.go diff --git a/service/s3/api_client.go b/service/s3/api_client.go index 9d38e73a511..74c649c11e5 100644 --- a/service/s3/api_client.go +++ b/service/s3/api_client.go @@ -12,6 +12,7 @@ import ( awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" acceptencodingcust "github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding" "github.com/aws/aws-sdk-go-v2/service/internal/s3shared" + s3sharedconfig "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" smithy "github.com/awslabs/smithy-go" "github.com/awslabs/smithy-go/logging" @@ -177,6 +178,7 @@ func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { ClientLogMode: cfg.ClientLogMode, } resolveAWSEndpointResolver(cfg, &opts) + resolveClientConfig(cfg, &opts) return New(opts, optFns...) } @@ -241,6 +243,21 @@ func addRetryMiddlewares(stack *middleware.Stack, o Options) error { return retry.AddRetryMiddlewares(stack, mo) } +// resolves client config +func resolveClientConfig(cfg aws.Config, o *Options) error { + if len(cfg.ConfigSources) == 0 { + return nil + } + value, found, err := s3sharedconfig.ResolveUseARNRegion(context.Background(), cfg.ConfigSources) + if err != nil { + return err + } + if found { + o.UseARNRegion = value + } + return nil +} + func addMetadataRetrieverMiddleware(stack *middleware.Stack) error { return s3shared.AddMetadataRetrieverMiddleware(stack) } diff --git a/service/s3/internal/configtesting/config_test.go b/service/s3/internal/configtesting/config_test.go index 3a5ac646810..72c72e23bea 100644 --- a/service/s3/internal/configtesting/config_test.go +++ b/service/s3/internal/configtesting/config_test.go @@ -4,7 +4,7 @@ package configtesting import ( "github.com/aws/aws-sdk-go-v2/config" - svcExternal "github.com/aws/aws-sdk-go-v2/service/s3/internal/config" + svcExternal "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config" ) // UseARNRegionProvider Assertions diff --git a/service/s3/internal/configtesting/go.mod b/service/s3/internal/configtesting/go.mod index 87a2a20dc24..21acf0ab29e 100644 --- a/service/s3/internal/configtesting/go.mod +++ b/service/s3/internal/configtesting/go.mod @@ -4,7 +4,7 @@ go 1.15 require ( github.com/aws/aws-sdk-go-v2/config v0.3.0 - github.com/aws/aws-sdk-go-v2/service/s3 v0.30.0 + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v0.3.3-0.20201217001905-4acf9c65b2d1 ) replace ( diff --git a/service/s3/internal/configtesting/go.sum b/service/s3/internal/configtesting/go.sum index a876f65ba8c..1267f88cb2a 100644 --- a/service/s3/internal/configtesting/go.sum +++ b/service/s3/internal/configtesting/go.sum @@ -1,5 +1,3 @@ -github.com/awslabs/smithy-go v0.4.0 h1:El0KyKn4zdM3pLuWJlgoeitQuu/mjwUPssr7L3xu3vs= -github.com/awslabs/smithy-go v0.4.0/go.mod h1:hPOQwnmBLHsUphH13tVSjQhTAFma0/0XoZGbBcOuABI= github.com/awslabs/smithy-go v0.4.1-0.20201216214517-20e212c92831 h1:1yUZARt7tftsJrn/7eEIs6qix36mIm+/5Ui72B7ClCA= github.com/awslabs/smithy-go v0.4.1-0.20201216214517-20e212c92831/go.mod h1:hPOQwnmBLHsUphH13tVSjQhTAFma0/0XoZGbBcOuABI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/service/s3control/api_client.go b/service/s3control/api_client.go index 6915fb23b85..cd216eed1a8 100644 --- a/service/s3control/api_client.go +++ b/service/s3control/api_client.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" "github.com/aws/aws-sdk-go-v2/service/internal/s3shared" + s3sharedconfig "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config" smithy "github.com/awslabs/smithy-go" "github.com/awslabs/smithy-go/logging" "github.com/awslabs/smithy-go/middleware" @@ -168,6 +169,7 @@ func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { ClientLogMode: cfg.ClientLogMode, } resolveAWSEndpointResolver(cfg, &opts) + resolveClientConfig(cfg, &opts) return New(opts, optFns...) } @@ -238,6 +240,21 @@ func addRetryMiddlewares(stack *middleware.Stack, o Options) error { return retry.AddRetryMiddlewares(stack, mo) } +// resolves client config +func resolveClientConfig(cfg aws.Config, o *Options) error { + if len(cfg.ConfigSources) == 0 { + return nil + } + value, found, err := s3sharedconfig.ResolveUseARNRegion(context.Background(), cfg.ConfigSources) + if err != nil { + return err + } + if found { + o.UseARNRegion = value + } + return nil +} + // IdempotencyTokenProvider interface for providing idempotency token type IdempotencyTokenProvider interface { GetIdempotencyToken() (string, error)