From 7ecd43bb02f4665bfdaded1b3072526fc9f33cab Mon Sep 17 00:00:00 2001 From: Luc Talatinian Date: Tue, 21 Nov 2023 13:58:38 -0500 Subject: [PATCH 1/2] breakfix: convert public access block config fields to nilable like s3 --- .../08c84fb2c6644d8b983c9986c770cfda.json | 8 +++ .../codegen/customization/RemoveDefaults.java | 52 +++++++++++++++++++ ...mithy.go.codegen.integration.GoIntegration | 1 + service/s3control/deserializers.go | 8 +-- service/s3control/serializers.go | 16 +++--- service/s3control/types/types.go | 8 +-- 6 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 .changelog/08c84fb2c6644d8b983c9986c770cfda.json create mode 100644 codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java diff --git a/.changelog/08c84fb2c6644d8b983c9986c770cfda.json b/.changelog/08c84fb2c6644d8b983c9986c770cfda.json new file mode 100644 index 00000000000..1b79deaa116 --- /dev/null +++ b/.changelog/08c84fb2c6644d8b983c9986c770cfda.json @@ -0,0 +1,8 @@ +{ + "id": "08c84fb2-c664-4d8b-983c-9986c770cfda", + "type": "feature", + "description": "**BREAK FIX**: Convert S3Control PublicAccessBlock field types to nilable. See #2384, #2162.", + "modules": [ + "service/s3control" + ] +} \ No newline at end of file diff --git a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java new file mode 100644 index 00000000000..1b514746251 --- /dev/null +++ b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java @@ -0,0 +1,52 @@ +package software.amazon.smithy.aws.go.codegen.customization; + +import software.amazon.smithy.go.codegen.GoSettings; +import software.amazon.smithy.go.codegen.integration.GoIntegration; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.AbstractShapeBuilder; +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.utils.MapUtils; +import software.amazon.smithy.utils.SetUtils; +import software.amazon.smithy.utils.ToSmithyBuilder; + +import java.util.Map; +import java.util.Set; + +public class RemoveDefaults implements GoIntegration { + private static final Map> toRemove = MapUtils.of( + ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820"), SetUtils.of( + ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$BlockPublicAcls"), + ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$IgnorePublicAcls"), + ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$BlockPublicPolicy"), + ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$RestrictPublicBuckets") + ) + ); + + private boolean mustPreprocess(ShapeId service) { + return toRemove.containsKey(service); + } + + @Override + public Model preprocessModel(Model model, GoSettings settings) { + var serviceId = settings.getService(); + return mustPreprocess(serviceId) + ? removeDefaults(model, toRemove.get(serviceId)) + : model; + } + + private Model removeDefaults(Model model, Set fromShapes) { + return ModelTransformer.create().mapShapes(model, it -> + fromShapes.contains(it.getId()) + ? withoutDefault(it) + : it + ); + } + + private Shape withoutDefault(Shape shape) { + var builder = ((ToSmithyBuilder) shape).toBuilder(); + return ((AbstractShapeBuilder) builder).removeTrait(DefaultTrait.ID).build(); + } +} \ No newline at end of file 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 a11ba3adf31..695579db572 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 @@ -68,3 +68,4 @@ software.amazon.smithy.aws.go.codegen.customization.auth.EndpointAuthResolution software.amazon.smithy.aws.go.codegen.customization.auth.AwsSigV4aAuthScheme software.amazon.smithy.aws.go.codegen.customization.auth.LegacyAuthContextOverride software.amazon.smithy.aws.go.codegen.customization.auth.IgnoreAnonymousCredentials +software.amazon.smithy.aws.go.codegen.customization.RemoveDefaults diff --git a/service/s3control/deserializers.go b/service/s3control/deserializers.go index 8e6ca25e27a..6c6ef30fdee 100644 --- a/service/s3control/deserializers.go +++ b/service/s3control/deserializers.go @@ -15169,7 +15169,7 @@ func awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(v **types.Publ if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } - sv.BlockPublicAcls = xtv + sv.BlockPublicAcls = ptr.Bool(xtv) } case strings.EqualFold("BlockPublicPolicy", t.Name.Local): @@ -15185,7 +15185,7 @@ func awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(v **types.Publ if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } - sv.BlockPublicPolicy = xtv + sv.BlockPublicPolicy = ptr.Bool(xtv) } case strings.EqualFold("IgnorePublicAcls", t.Name.Local): @@ -15201,7 +15201,7 @@ func awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(v **types.Publ if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } - sv.IgnorePublicAcls = xtv + sv.IgnorePublicAcls = ptr.Bool(xtv) } case strings.EqualFold("RestrictPublicBuckets", t.Name.Local): @@ -15217,7 +15217,7 @@ func awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(v **types.Publ if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } - sv.RestrictPublicBuckets = xtv + sv.RestrictPublicBuckets = ptr.Bool(xtv) } default: diff --git a/service/s3control/serializers.go b/service/s3control/serializers.go index 537e5d291db..dfa21c43f75 100644 --- a/service/s3control/serializers.go +++ b/service/s3control/serializers.go @@ -7773,7 +7773,7 @@ func awsRestxml_serializeDocumentPrefixLevelStorageMetrics(v *types.PrefixLevelS func awsRestxml_serializeDocumentPublicAccessBlockConfiguration(v *types.PublicAccessBlockConfiguration, value smithyxml.Value) error { defer value.Close() - if v.BlockPublicAcls { + if v.BlockPublicAcls != nil { rootAttr := []smithyxml.Attr{} root := smithyxml.StartElement{ Name: smithyxml.Name{ @@ -7782,9 +7782,9 @@ func awsRestxml_serializeDocumentPublicAccessBlockConfiguration(v *types.PublicA Attr: rootAttr, } el := value.MemberElement(root) - el.Boolean(v.BlockPublicAcls) + el.Boolean(*v.BlockPublicAcls) } - if v.BlockPublicPolicy { + if v.BlockPublicPolicy != nil { rootAttr := []smithyxml.Attr{} root := smithyxml.StartElement{ Name: smithyxml.Name{ @@ -7793,9 +7793,9 @@ func awsRestxml_serializeDocumentPublicAccessBlockConfiguration(v *types.PublicA Attr: rootAttr, } el := value.MemberElement(root) - el.Boolean(v.BlockPublicPolicy) + el.Boolean(*v.BlockPublicPolicy) } - if v.IgnorePublicAcls { + if v.IgnorePublicAcls != nil { rootAttr := []smithyxml.Attr{} root := smithyxml.StartElement{ Name: smithyxml.Name{ @@ -7804,9 +7804,9 @@ func awsRestxml_serializeDocumentPublicAccessBlockConfiguration(v *types.PublicA Attr: rootAttr, } el := value.MemberElement(root) - el.Boolean(v.IgnorePublicAcls) + el.Boolean(*v.IgnorePublicAcls) } - if v.RestrictPublicBuckets { + if v.RestrictPublicBuckets != nil { rootAttr := []smithyxml.Attr{} root := smithyxml.StartElement{ Name: smithyxml.Name{ @@ -7815,7 +7815,7 @@ func awsRestxml_serializeDocumentPublicAccessBlockConfiguration(v *types.PublicA Attr: rootAttr, } el := value.MemberElement(root) - el.Boolean(v.RestrictPublicBuckets) + el.Boolean(*v.RestrictPublicBuckets) } return nil } diff --git a/service/s3control/types/types.go b/service/s3control/types/types.go index ac62e6bfb21..725a1ea08f5 100644 --- a/service/s3control/types/types.go +++ b/service/s3control/types/types.go @@ -1346,14 +1346,14 @@ type PublicAccessBlockConfiguration struct { // - PUT Bucket calls fail if the request includes a public ACL. // Enabling this setting doesn't affect existing policies or ACLs. This property // is not supported for Amazon S3 on Outposts. - BlockPublicAcls bool + BlockPublicAcls *bool // Specifies whether Amazon S3 should block public bucket policies for buckets in // this account. Setting this element to TRUE causes Amazon S3 to reject calls to // PUT Bucket policy if the specified bucket policy allows public access. Enabling // this setting doesn't affect existing bucket policies. This property is not // supported for Amazon S3 on Outposts. - BlockPublicPolicy bool + BlockPublicPolicy *bool // Specifies whether Amazon S3 should ignore public ACLs for buckets in this // account. Setting this element to TRUE causes Amazon S3 to ignore all public @@ -1361,7 +1361,7 @@ type PublicAccessBlockConfiguration struct { // setting doesn't affect the persistence of any existing ACLs and doesn't prevent // new public ACLs from being set. This property is not supported for Amazon S3 on // Outposts. - IgnorePublicAcls bool + IgnorePublicAcls *bool // Specifies whether Amazon S3 should restrict public bucket policies for buckets // in this account. Setting this element to TRUE restricts access to buckets with @@ -1370,7 +1370,7 @@ type PublicAccessBlockConfiguration struct { // bucket policies, except that public and cross-account access within any public // bucket policy, including non-public delegation to specific accounts, is blocked. // This property is not supported for Amazon S3 on Outposts. - RestrictPublicBuckets bool + RestrictPublicBuckets *bool noSmithyDocumentSerde } From 06d1bf407118d173b578e5149f2b27505aa5f5b8 Mon Sep 17 00:00:00 2001 From: Luc Talatinian Date: Tue, 21 Nov 2023 14:27:09 -0500 Subject: [PATCH 2/2] uncomplicate toBuilder invocation --- .../smithy/aws/go/codegen/customization/RemoveDefaults.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java index 1b514746251..65842ac6a91 100644 --- a/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java +++ b/codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/RemoveDefaults.java @@ -46,7 +46,8 @@ private Model removeDefaults(Model model, Set fromShapes) { } private Shape withoutDefault(Shape shape) { - var builder = ((ToSmithyBuilder) shape).toBuilder(); - return ((AbstractShapeBuilder) builder).removeTrait(DefaultTrait.ID).build(); + return Shape.shapeToBuilder(shape) + .removeTrait(DefaultTrait.ID) + .build(); } } \ No newline at end of file