From e969e64f3de96b79fb0902ae1ceb0fc2f7776b05 Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Wed, 13 Mar 2024 01:54:10 -0400 Subject: [PATCH 01/16] Add required property to defineConditionKeys to be used for serviceResolvedConditionKeys --- .../iam/traits/ConditionKeyDefinition.java | 27 ++++++++++++- .../resources/META-INF/smithy/aws.iam.smithy | 4 ++ .../traits/DefineConditionKeysTraitTest.java | 38 +++++++++++++++++++ .../iam/traits/define-condition-keys.smithy | 30 +++++++++++++++ .../define-conditionkeys-norequired.errors | 0 .../define-conditionkeys-norequired.smithy | 18 +++++++++ ...conditionkeys-required-booleancheck.errors | 2 + ...conditionkeys-required-booleancheck.smithy | 19 ++++++++++ .../define-conditionkeys-required.errors | 0 .../define-conditionkeys-required.smithy | 19 ++++++++++ 10 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 smithy-aws-iam-traits/src/test/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitTest.java create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/define-condition-keys.smithy create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-norequired.errors create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-norequired.smithy create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.errors create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.smithy create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required.errors create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required.smithy diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index da0b38d61d5..957b428e1b1 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -17,6 +17,8 @@ import java.util.Objects; import java.util.Optional; + +import software.amazon.smithy.model.node.BooleanNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; @@ -29,17 +31,25 @@ public final class ConditionKeyDefinition implements ToNode, ToSmithyBuilder getRelativeDocumentation() { return Optional.ofNullable(relativeDocumentation); } + public Optional getRequired() { return Optional.ofNullable(required); } + @Override public SmithyBuilder toBuilder() { return builder() .documentation(documentation) .externalDocumentation(externalDocumentation) .relativeDocumentation(relativeDocumentation) - .type(type); + .type(type) + .required(required); } @Override @@ -107,6 +122,7 @@ public Node toNode() { .withOptionalMember(DOCUMENTATION, getDocumentation().map(Node::from)) .withOptionalMember(EXTERNAL_DOCUMENTATION, getExternalDocumentation().map(Node::from)) .withOptionalMember(RELATIVE_DOCUMENTATION, getRelativeDocumentation().map(Node::from)) + .withOptionalMember(REQUIRED, getRequired().map(Node::from)) .build(); } @@ -122,7 +138,8 @@ public boolean equals(Object o) { return Objects.equals(type, that.type) && Objects.equals(documentation, that.documentation) && Objects.equals(externalDocumentation, that.externalDocumentation) - && Objects.equals(relativeDocumentation, that.relativeDocumentation); + && Objects.equals(relativeDocumentation, that.relativeDocumentation) + && Objects.equals(required, that.required); } @Override @@ -135,6 +152,7 @@ public static final class Builder implements SmithyBuilder Date: Wed, 13 Mar 2024 02:14:55 -0400 Subject: [PATCH 02/16] adding required to IAM trait docs for defineConditionKeys --- docs/source-2.0/aws/aws-iam.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/source-2.0/aws/aws-iam.rst b/docs/source-2.0/aws/aws-iam.rst index 91377a1fe3b..12b1bf23af7 100644 --- a/docs/source-2.0/aws/aws-iam.rst +++ b/docs/source-2.0/aws/aws-iam.rst @@ -432,6 +432,11 @@ Each condition key structure supports the following members: - ``string`` - A relative URL path that defines more information about the condition key within a set of IAM-related documentation. + * - required + - ``boolean`` + - Defines whether a service resolved condition key is required. Not + applicable to request resolved condition keys as the native + @required trait must be used on the field directly. .. code-block:: smithy @@ -448,7 +453,14 @@ Each condition key structure supports the following members: type: "String" documentation: "The Bar string" externalDocumentation: "http://example.com" - }) + }, + "myservice:Baz": { + type: "String" + documentation: "The Baz string" + externalDocumentation: "http://baz.com" + required: true + } + ) service MyService { version: "2017-02-11" resources: [MyResource] From 3a1aa9195ef3921a3800a689d6dc474253b06187 Mon Sep 17 00:00:00 2001 From: 0xjjoyy <48747652+0xjjoyy@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:49:22 -0400 Subject: [PATCH 03/16] Update docs/source-2.0/aws/aws-iam.rst typo Co-authored-by: Kevin Stich --- docs/source-2.0/aws/aws-iam.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source-2.0/aws/aws-iam.rst b/docs/source-2.0/aws/aws-iam.rst index 12b1bf23af7..c58f4fb9745 100644 --- a/docs/source-2.0/aws/aws-iam.rst +++ b/docs/source-2.0/aws/aws-iam.rst @@ -435,7 +435,7 @@ Each condition key structure supports the following members: * - required - ``boolean`` - Defines whether a service resolved condition key is required. Not - applicable to request resolved condition keys as the native + applicable to request resolved condition keys, as the native @required trait must be used on the field directly. .. code-block:: smithy From fc0b889be99ac0ef361c8f1ec4bc2f62bf1290ff Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Mon, 8 Apr 2024 13:03:57 -0400 Subject: [PATCH 04/16] primitive boolean isRequired --- .../smithy/aws/iam/traits/ConditionKeyDefinition.java | 4 ++-- .../smithy/aws/iam/traits/DefineConditionKeysTraitTest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index 957b428e1b1..49e31280439 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -103,7 +103,7 @@ public Optional getRelativeDocumentation() { return Optional.ofNullable(relativeDocumentation); } - public Optional getRequired() { return Optional.ofNullable(required); } + public Boolean isRequired() { return required; } @Override public SmithyBuilder toBuilder() { @@ -122,7 +122,7 @@ public Node toNode() { .withOptionalMember(DOCUMENTATION, getDocumentation().map(Node::from)) .withOptionalMember(EXTERNAL_DOCUMENTATION, getExternalDocumentation().map(Node::from)) .withOptionalMember(RELATIVE_DOCUMENTATION, getRelativeDocumentation().map(Node::from)) - .withOptionalMember(REQUIRED, getRequired().map(Node::from)) + .withMember(REQUIRED, isRequired()) .build(); } diff --git a/smithy-aws-iam-traits/src/test/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitTest.java b/smithy-aws-iam-traits/src/test/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitTest.java index 677bbc8874c..5ab1dab9ceb 100644 --- a/smithy-aws-iam-traits/src/test/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitTest.java +++ b/smithy-aws-iam-traits/src/test/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitTest.java @@ -31,8 +31,8 @@ public void loadsFromModel() { Shape shape = result.expectShape(ShapeId.from("smithy.example#MyService")); DefineConditionKeysTrait trait = shape.expectTrait(DefineConditionKeysTrait.class); assertEquals(3,trait.getConditionKeys().size()); - assertFalse(trait.getConditionKey("myservice:Bar").get().getRequired().get()); - assertFalse(trait.getConditionKey("myservice:Foo").get().getRequired().get()); - assertTrue(trait.getConditionKey("myservice:Baz").get().getRequired().get()); + assertFalse(trait.getConditionKey("myservice:Bar").get().isRequired()); + assertFalse(trait.getConditionKey("myservice:Foo").get().isRequired()); + assertTrue(trait.getConditionKey("myservice:Baz").get().isRequired()); } } From 7a88ca17f7bf416b4a5297858e7081c9282ad6bb Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Mon, 8 Apr 2024 13:05:38 -0400 Subject: [PATCH 05/16] moving javadoc to method --- .../smithy/aws/iam/traits/ConditionKeyDefinition.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index 49e31280439..12f6008556d 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -38,10 +38,6 @@ public final class ConditionKeyDefinition implements ToNode, ToSmithyBuilder getRelativeDocumentation() { return Optional.ofNullable(relativeDocumentation); } + /** + * Whether a service resolved condition key is required + * Not applicable to request resolved condition key as the native @required trait must be used + **/ public Boolean isRequired() { return required; } @Override From 438615e12869d70b95fdd0eeb96e875d6cf8b6dc Mon Sep 17 00:00:00 2001 From: 0xjjoyy <48747652+0xjjoyy@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:07:14 -0400 Subject: [PATCH 06/16] Update smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy period Co-authored-by: Kevin Stich --- .../src/main/resources/META-INF/smithy/aws.iam.smithy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy b/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy index db590a1b0e3..3b6f32c89e1 100644 --- a/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy +++ b/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy @@ -120,7 +120,7 @@ structure ConditionKeyDefinition { /// within a set of IAM-related documentation. relativeDocumentation: String - // Whether a service resolved condition key is required + // Whether a service resolved condition key is required. // Not applicable to request resolved condition key as the native @required trait must be used required: Boolean } From 94b4d8e4fb19018fa7a707f25bd71001410cbe91 Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Mon, 8 Apr 2024 13:10:13 -0400 Subject: [PATCH 07/16] add EOF --- .../amazon/smithy/aws/iam/traits/define-condition-keys.smithy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/define-condition-keys.smithy b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/define-condition-keys.smithy index ea361202161..f82f671d4d3 100644 --- a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/define-condition-keys.smithy +++ b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/define-condition-keys.smithy @@ -27,4 +27,4 @@ use aws.iam#defineConditionKeys ) service MyService { version: "2017-02-11" -} \ No newline at end of file +} From e1d13dfcfb28c8d0692d5cb59a408f5ef618936c Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Mon, 8 Apr 2024 14:53:25 -0400 Subject: [PATCH 08/16] fix checkstyle errors --- .../smithy/aws/iam/traits/ConditionKeyDefinition.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index 12f6008556d..42fdf9b91b5 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -17,7 +17,6 @@ import java.util.Objects; import java.util.Optional; - import software.amazon.smithy.model.node.BooleanNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; @@ -100,10 +99,12 @@ public Optional getRelativeDocumentation() { } /** - * Whether a service resolved condition key is required - * Not applicable to request resolved condition key as the native @required trait must be used + * Whether a service resolved condition key is required. + * Not applicable to request resolved condition key as the native @required trait must be used. **/ - public Boolean isRequired() { return required; } + public Boolean isRequired() { + return required; + } @Override public SmithyBuilder toBuilder() { From 949e8397227b50fc1d353f3c092c5c01d0afde1c Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Tue, 9 Apr 2024 08:29:20 -0400 Subject: [PATCH 09/16] typo --- .../src/main/resources/META-INF/smithy/aws.iam.smithy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy b/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy index 3b6f32c89e1..3f24ea740be 100644 --- a/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy +++ b/smithy-aws-iam-traits/src/main/resources/META-INF/smithy/aws.iam.smithy @@ -121,7 +121,7 @@ structure ConditionKeyDefinition { relativeDocumentation: String // Whether a service resolved condition key is required. - // Not applicable to request resolved condition key as the native @required trait must be used + // Not applicable to request resolved condition keys, as the native @required trait must be used required: Boolean } From ac55de3e84f4192001aa82af9fef21d78a267af5 Mon Sep 17 00:00:00 2001 From: 0xjjoyy <48747652+0xjjoyy@users.noreply.github.com> Date: Tue, 9 Apr 2024 08:31:16 -0400 Subject: [PATCH 10/16] Update smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java Co-authored-by: Kevin Stich --- .../smithy/aws/iam/traits/ConditionKeyDefinition.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index 42fdf9b91b5..9a13006cd9a 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -99,10 +99,12 @@ public Optional getRelativeDocumentation() { } /** - * Whether a service resolved condition key is required. - * Not applicable to request resolved condition key as the native @required trait must be used. + * Whether a service resolved condition key is required. Not applicable to request resolved condition key, + * as the native @required trait must be used. + * + * @return If the service resolved condition key is required. **/ - public Boolean isRequired() { + public boolean isRequired() { return required; } From 2bfcb2a20310b1cafc4c25e02ac4c067d36839bd Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Tue, 9 Apr 2024 08:33:33 -0400 Subject: [PATCH 11/16] remove define-conditionkeys-required-booleancheck.smithy --- ...conditionkeys-required-booleancheck.errors | 2 -- ...conditionkeys-required-booleancheck.smithy | 19 ------------------- 2 files changed, 21 deletions(-) delete mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.errors delete mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.smithy diff --git a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.errors b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.errors deleted file mode 100644 index 4214ef7c7ce..00000000000 --- a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.errors +++ /dev/null @@ -1,2 +0,0 @@ -[DANGER] -: Syntactic shape ID `trues` does not resolve to a valid shape ID: `smithy.example#trues`. Did you mean to quote this string? Are you missing a model file? | SyntacticShapeIdTarget -[ERROR] smithy.example#MyService: Error creating trait `aws.iam#defineConditionKeys`: Expected `required` to be a boolean; found string | Model \ No newline at end of file diff --git a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.smithy b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.smithy deleted file mode 100644 index eb94e32ecc9..00000000000 --- a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required-booleancheck.smithy +++ /dev/null @@ -1,19 +0,0 @@ -$version: "2" - -namespace smithy.example - -use aws.api#service -use aws.iam#defineConditionKeys - -@service(sdkId: "My Value", arnNamespace: "myservice") -@defineConditionKeys( - "myservice:Bar": { - type: "String" - documentation: "The Bar string" - externalDocumentation: "http://example.com" - required: trues - }) -service MyService { - version: "2017-02-11" -} - From a01f67a59138acd77c6c93faa298f4635ae022c4 Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Tue, 9 Apr 2024 08:36:24 -0400 Subject: [PATCH 12/16] typo --- .../amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index 9a13006cd9a..c1738d2e5eb 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -99,7 +99,7 @@ public Optional getRelativeDocumentation() { } /** - * Whether a service resolved condition key is required. Not applicable to request resolved condition key, + * Whether a service resolved condition key is required. Not applicable to request resolved condition keys, * as the native @required trait must be used. * * @return If the service resolved condition key is required. From 021c184044e986bdf689fa106dfd6f08ed6f814a Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Tue, 9 Apr 2024 09:01:24 -0400 Subject: [PATCH 13/16] add ref for requried trait --- docs/source-2.0/aws/aws-iam.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source-2.0/aws/aws-iam.rst b/docs/source-2.0/aws/aws-iam.rst index c58f4fb9745..3dfb225d00a 100644 --- a/docs/source-2.0/aws/aws-iam.rst +++ b/docs/source-2.0/aws/aws-iam.rst @@ -436,7 +436,7 @@ Each condition key structure supports the following members: - ``boolean`` - Defines whether a service resolved condition key is required. Not applicable to request resolved condition keys, as the native - @required trait must be used on the field directly. + :ref:`required-trait` trait must be used on the field directly. .. code-block:: smithy From 9514eb4c0e57df832fe34d037d17547343650f58 Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Tue, 9 Apr 2024 12:59:40 -0400 Subject: [PATCH 14/16] add DefineConditionKeysTraitValidator to check only service resolved keys use the required property --- .../DefineConditionKeysTraitValidator.java | 78 +++++++++++++++++++ ...e.amazon.smithy.model.validation.Validator | 1 + ...ys-requestresolved-required-invalid.errors | 1 + ...ys-requestresolved-required-invalid.smithy | 19 +++++ .../define-conditionkeys-required.smithy | 2 + 5 files changed, 101 insertions(+) create mode 100644 smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.errors create mode 100644 smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.smithy diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java new file mode 100644 index 00000000000..605589e2070 --- /dev/null +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java @@ -0,0 +1,78 @@ +/* + * 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.aws.iam.traits; + +import java.util.Collection; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.validation.AbstractValidator; +import software.amazon.smithy.model.validation.ValidationEvent; + + +/** + * Checks properties of the defineConditionKeys IAM trait + * 1. @required only for service resolved condition keys. ERROR if used for request resolved condition keys. + */ +public final class DefineConditionKeysTraitValidator extends AbstractValidator { + + @Override + public List validate(Model model) { + class Record { + final Shape shape; + final Entry details; + + Record(Shape shape, Set> details) { + this.shape = shape; + this.details = details.iterator().next(); + } + } + + Set defineConditionKeys = model.getShapesWithTrait(DefineConditionKeysTrait.class); + Set serviceResolvedConditionKeys = model.getShapesWithTrait(ServiceResolvedConditionKeysTrait.class); + + // get all the service resolved condition keys + Set serviceResolvedKeynames = serviceResolvedConditionKeys.stream().map(shape -> { + ServiceResolvedConditionKeysTrait trait = shape.expectTrait(ServiceResolvedConditionKeysTrait.class); + return trait.getValues(); + }).flatMap(Collection::stream).collect(Collectors.toSet()); + + // get all the defined condition keys that are required + Set requiredConditionKeyRecords = defineConditionKeys.stream().map(shape -> { + DefineConditionKeysTrait trait = shape.expectTrait(DefineConditionKeysTrait.class); + return new Record(shape, trait.getConditionKeys().entrySet()); + }).filter(record -> record.details.getValue().isRequired()).collect(Collectors.toSet()); + + // get all the defined condition keys are required though not defined as service resolved condition keys + Set incorretRequestResolved = requiredConditionKeyRecords.stream().filter(record -> + !serviceResolvedKeynames.contains(record.details.getKey())).collect(Collectors.toSet()); + + + /** + * All these are request resolved condition keys, + * though specified required as a property instead of a smithy trait + */ + return incorretRequestResolved.stream().map( + record -> + error(record.shape, + "Use the @required trait on the field directly. " + + "The required property is only for Service Resolved Condition Keys." + )).collect(Collectors.toList()); + } +} diff --git a/smithy-aws-iam-traits/src/main/resources/META-INF/services/software.amazon.smithy.model.validation.Validator b/smithy-aws-iam-traits/src/main/resources/META-INF/services/software.amazon.smithy.model.validation.Validator index 856e5dbe68a..cb5276ba11f 100644 --- a/smithy-aws-iam-traits/src/main/resources/META-INF/services/software.amazon.smithy.model.validation.Validator +++ b/smithy-aws-iam-traits/src/main/resources/META-INF/services/software.amazon.smithy.model.validation.Validator @@ -1,3 +1,4 @@ software.amazon.smithy.aws.iam.traits.ConditionKeysValidator software.amazon.smithy.aws.iam.traits.IamActionValidator software.amazon.smithy.aws.iam.traits.IamResourceTraitValidator +software.amazon.smithy.aws.iam.traits.DefineConditionKeysTraitValidator \ No newline at end of file diff --git a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.errors b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.errors new file mode 100644 index 00000000000..32407ec2065 --- /dev/null +++ b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.errors @@ -0,0 +1 @@ +[ERROR] smithy.example#MyService: Use the @required trait on the field directly. The required property is only for Service Resolved Condition Keys. | DefineConditionKeysTrait \ No newline at end of file diff --git a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.smithy b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.smithy new file mode 100644 index 00000000000..004c04a161b --- /dev/null +++ b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-requestresolved-required-invalid.smithy @@ -0,0 +1,19 @@ +$version: "2" + +namespace smithy.example + +use aws.api#service +use aws.iam#defineConditionKeys + +@service(sdkId: "My Value", arnNamespace: "myservice") +@defineConditionKeys( + "myservice:Bar": { + type: "String" + documentation: "The Bar string" + externalDocumentation: "http://example.com" + required: true + }) +service MyService { + version: "2017-02-11" +} + diff --git a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required.smithy b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required.smithy index 004c04a161b..a7ba99d00fa 100644 --- a/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required.smithy +++ b/smithy-aws-iam-traits/src/test/resources/software/amazon/smithy/aws/iam/traits/errorfiles/define-conditionkeys-required.smithy @@ -4,6 +4,7 @@ namespace smithy.example use aws.api#service use aws.iam#defineConditionKeys +use aws.iam#serviceResolvedConditionKeys @service(sdkId: "My Value", arnNamespace: "myservice") @defineConditionKeys( @@ -13,6 +14,7 @@ use aws.iam#defineConditionKeys externalDocumentation: "http://example.com" required: true }) +@serviceResolvedConditionKeys(["myservice:Bar"]) service MyService { version: "2017-02-11" } From 3160a7e5d7c47c5ca938f683756b43376082e09f Mon Sep 17 00:00:00 2001 From: Josh Joy Date: Tue, 9 Apr 2024 13:05:29 -0400 Subject: [PATCH 15/16] remove newline --- .../amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java | 1 - 1 file changed, 1 deletion(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java index c1738d2e5eb..74f21611422 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeyDefinition.java @@ -31,7 +31,6 @@ public final class ConditionKeyDefinition implements ToNode, ToSmithyBuilder Date: Tue, 9 Apr 2024 14:07:39 -0400 Subject: [PATCH 16/16] update license header --- .../traits/DefineConditionKeysTraitValidator.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java index 605589e2070..c10c0773846 100644 --- a/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java +++ b/smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/DefineConditionKeysTraitValidator.java @@ -1,16 +1,6 @@ /* - * 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. + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.aws.iam.traits;