Skip to content

Commit

Permalink
codegen: use real sigv4a trait (aws#491)
Browse files Browse the repository at this point in the history
* codegen: use real sigv4a trait

* include region auth param for sigv4a
  • Loading branch information
lucix-aws authored Jan 5, 2024
1 parent 4909204 commit daa9e2b
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 98 deletions.
8 changes: 8 additions & 0 deletions .changelog/b39efe9f60e14df1b6fcab1c5795d0a4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"id": "b39efe9f-60e1-4df1-b6fc-ab1c5795d0a4",
"type": "feature",
"description": "Add codegen definition for sigv4a trait.",
"modules": [
"."
]
}
2 changes: 1 addition & 1 deletion codegen/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
smithyVersion=1.41.1
smithyVersion=1.42.0
smithyGradleVersion=0.7.0

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.
*/

package software.amazon.smithy.go.codegen.integration.auth;

import static software.amazon.smithy.go.codegen.GoWriter.emptyGoTemplate;
import static software.amazon.smithy.go.codegen.GoWriter.goTemplate;

import java.util.Map;
import software.amazon.smithy.aws.traits.auth.SigV4ATrait;
import software.amazon.smithy.aws.traits.auth.SigV4Trait;
import software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait;
import software.amazon.smithy.go.codegen.GoWriter;
import software.amazon.smithy.go.codegen.SmithyGoTypes;
import software.amazon.smithy.go.codegen.integration.AuthSchemeDefinition;
import software.amazon.smithy.go.codegen.integration.ProtocolGenerator;
import software.amazon.smithy.model.shapes.OperationShape;
import software.amazon.smithy.model.shapes.ServiceShape;
import software.amazon.smithy.utils.MapUtils;

/**
* Implements codegen for aws.auth#sigv4a.
*/
public class SigV4ADefinition implements AuthSchemeDefinition {
private static final Map<String, Object> COMMON_ENV = MapUtils.of(
"properties", SmithyGoTypes.Smithy.Properties,
"option", SmithyGoTypes.Auth.Option,
"schemeId", SmithyGoTypes.Auth.SchemeIDSigV4A,
"setSigningName", SmithyGoTypes.Transport.Http.SetSigV4ASigningName,
"setSigningRegions", SmithyGoTypes.Transport.Http.SetSigV4ASigningRegions
);

@Override
public GoWriter.Writable generateServiceOption(
ProtocolGenerator.GenerationContext context, ServiceShape service
) {
var trait = service.expectTrait(SigV4ATrait.class);
return goTemplate("""
&$option:T{
SchemeID: $schemeId:T,
SignerProperties: func() $properties:T {
var props $properties:T
$setSigningName:T(&props, $name:S)
$setSigningRegions:T(&props, []string{params.Region})
return props
}(),
},""",
COMMON_ENV,
MapUtils.of(
"name", trait.getName()
));
}

@Override
public GoWriter.Writable generateOperationOption(
ProtocolGenerator.GenerationContext context, OperationShape operation
) {
var trait = context.getService().expectTrait(SigV4Trait.class);
return goTemplate("""
&$option:T{
SchemeID: $schemeId:T,
SignerProperties: func() $properties:T {
var props $properties:T
$setSigningName:T(&props, $name:S)
$setSigningRegions:T(&props, []string{params.Region})
$unsignedPayload:W
return props
}(),
},""",
COMMON_ENV,
MapUtils.of(
"name", trait.getName(),
"unsignedPayload", generateIsUnsignedPayload(operation)
));
}

private GoWriter.Writable generateIsUnsignedPayload(OperationShape operation) {
return operation.hasTrait(UnsignedPayloadTrait.class)
? goTemplate("$T(&props, true)", SmithyGoTypes.Transport.Http.SetIsUnsignedPayload)
: emptyGoTemplate();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package software.amazon.smithy.go.codegen.integration.auth;

import java.util.List;
import software.amazon.smithy.aws.traits.auth.SigV4ATrait;
import software.amazon.smithy.aws.traits.auth.SigV4Trait;
import software.amazon.smithy.go.codegen.auth.AuthParameter;
import software.amazon.smithy.go.codegen.integration.GoIntegration;
Expand All @@ -25,20 +26,20 @@
import software.amazon.smithy.utils.ListUtils;

/**
* Code generation for SigV4.
* Code generation for SigV4/SigV4A.
*/
public class SigV4AuthScheme implements GoIntegration {
private boolean isSigV4Service(Model model, ServiceShape service) {
return service.hasTrait(SigV4Trait.class);
private boolean isSigV4XService(Model model, ServiceShape service) {
return service.hasTrait(SigV4Trait.class) || service.hasTrait(SigV4ATrait.class);
}

@Override
public List<RuntimeClientPlugin> getClientPlugins() {
// FUTURE: add default Region client option, scheme definition, and resolver - we need a more structured way of
// suppressing elements of a GoIntegration before we do so, for now those live on the SDK side
// FUTURE: add default Region client option and scheme definitions - we need a more structured way of
// suppressing elements of a GoIntegration before we do so, for now those are registered SDK-side
return ListUtils.of(
RuntimeClientPlugin.builder()
.servicePredicate(this::isSigV4Service)
.servicePredicate(this::isSigV4XService)
.addAuthParameter(AuthParameter.REGION)
.build()
);
Expand Down

This file was deleted.

0 comments on commit daa9e2b

Please sign in to comment.