Skip to content

Commit

Permalink
fix(codegen): preprocess AwsQuery error to shapeId in waiter errorType (
Browse files Browse the repository at this point in the history
#6501)

Co-authored-by: Ran Vaknin <rvaknin@dev-dsk-rvaknin2-2a-e69e90c1.us-west-2.amazon.com>
  • Loading branch information
RanVaknin and Ran Vaknin committed Sep 25, 2024
1 parent c5124c1 commit b92df20
Show file tree
Hide file tree
Showing 18 changed files with 113 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ const checkState = async (client: DocDBClient, input: DescribeDBInstancesCommand
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "DBInstanceNotFound") {
if (exception.name && exception.name == "DBInstanceNotFoundFault") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const checkState = async (
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "LoadBalancerNotFound") {
if (exception.name && exception.name == "LoadBalancerNotFoundException") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const checkState = async (
return { state: WaiterState.SUCCESS, reason };
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "LoadBalancerNotFound") {
if (exception.name && exception.name == "LoadBalancerNotFoundException") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const checkState = async (
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "LoadBalancerNotFound") {
if (exception.name && exception.name == "LoadBalancerNotFoundException") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const checkState = async (
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "InvalidTarget") {
if (exception.name && exception.name == "InvalidTargetException") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const checkState = async (
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "InvalidInstance") {
if (exception.name && exception.name == "InvalidEndPointException") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const checkState = async (
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "InvalidInstance") {
if (exception.name && exception.name == "InvalidEndPointException") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ const checkState = async (
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "CacheClusterNotFound") {
if (exception.name && exception.name == "CacheClusterNotFoundFault") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
2 changes: 1 addition & 1 deletion clients/client-iam/src/waiters/waitForPolicyExists.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const checkState = async (client: IAMClient, input: GetPolicyCommandInput): Prom
return { state: WaiterState.SUCCESS, reason };
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "NoSuchEntity") {
if (exception.name && exception.name == "NoSuchEntityException") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
2 changes: 1 addition & 1 deletion clients/client-iam/src/waiters/waitForRoleExists.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const checkState = async (client: IAMClient, input: GetRoleCommandInput): Promis
return { state: WaiterState.SUCCESS, reason };
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "NoSuchEntity") {
if (exception.name && exception.name == "NoSuchEntityException") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
2 changes: 1 addition & 1 deletion clients/client-iam/src/waiters/waitForUserExists.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const checkState = async (client: IAMClient, input: GetUserCommandInput): Promis
return { state: WaiterState.SUCCESS, reason };
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "NoSuchEntity") {
if (exception.name && exception.name == "NoSuchEntityException") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ const checkState = async (client: NeptuneClient, input: DescribeDBInstancesComma
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "DBInstanceNotFound") {
if (exception.name && exception.name == "DBInstanceNotFoundFault") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
2 changes: 1 addition & 1 deletion clients/client-rds/src/waiters/waitForDBInstanceDeleted.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ const checkState = async (client: RDSClient, input: DescribeDBInstancesCommandIn
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "DBInstanceNotFound") {
if (exception.name && exception.name == "DBInstanceNotFoundFault") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
2 changes: 1 addition & 1 deletion clients/client-rds/src/waiters/waitForDBSnapshotDeleted.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ const checkState = async (client: RDSClient, input: DescribeDBSnapshotsCommandIn
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "DBSnapshotNotFound") {
if (exception.name && exception.name == "DBSnapshotNotFoundFault") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const checkState = async (client: RedshiftClient, input: DescribeClustersCommand
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "ClusterNotFound") {
if (exception.name && exception.name == "ClusterNotFoundFault") {
return { state: WaiterState.RETRY, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const checkState = async (client: RedshiftClient, input: DescribeClustersCommand
} catch (e) {}
} catch (exception) {
reason = exception;
if (exception.name && exception.name == "ClusterNotFound") {
if (exception.name && exception.name == "ClusterNotFoundFault") {
return { state: WaiterState.SUCCESS, reason };
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package software.amazon.smithy.aws.typescript.codegen;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import software.amazon.smithy.aws.traits.protocols.AwsQueryErrorTrait;
import software.amazon.smithy.model.Model;
import software.amazon.smithy.model.knowledge.TopDownIndex;
import software.amazon.smithy.model.node.ObjectNode;
import software.amazon.smithy.model.shapes.OperationShape;
import software.amazon.smithy.model.shapes.ServiceShape;
import software.amazon.smithy.model.shapes.Shape;
import software.amazon.smithy.model.shapes.ShapeId;
import software.amazon.smithy.model.traits.ErrorTrait;
import software.amazon.smithy.model.transform.ModelTransformer;
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
import software.amazon.smithy.utils.SmithyInternalApi;
import software.amazon.smithy.waiters.Acceptor;
import software.amazon.smithy.waiters.Matcher;
import software.amazon.smithy.waiters.WaitableTrait;
import software.amazon.smithy.waiters.Waiter;


@SmithyInternalApi
public final class ProcessAwsQueryWaiters implements TypeScriptIntegration {

@Override
public Model preprocessModel(Model model, TypeScriptSettings settings) {
Map<String, String> errorCodeToShapeId = new HashMap<>();

ServiceShape serviceShape = settings.getService(model);
TopDownIndex topDownIndex = TopDownIndex.of(model);
for (OperationShape operationShape : topDownIndex.getContainedOperations(serviceShape)) {
for (ShapeId errorShapeId : operationShape.getErrors()) {
Shape errorShape = model.expectShape(errorShapeId);
if (errorShape.hasTrait(ErrorTrait.class) && errorShape.hasTrait(AwsQueryErrorTrait.class)) {
AwsQueryErrorTrait awsQueryTrait = errorShape.expectTrait(AwsQueryErrorTrait.class);
errorCodeToShapeId.put(awsQueryTrait.getCode(), errorShape.getId().getName());
}
}
}

List<Shape> modifiedShapes = new ArrayList<>();

for (OperationShape operationShape : topDownIndex.getContainedOperations(serviceShape)) {
OperationShape.Builder operationBuilder = operationShape.toBuilder();
if (operationShape.hasTrait(WaitableTrait.class)) {
operationBuilder.removeTrait(WaitableTrait.ID);
WaitableTrait waiterTrait = operationShape.expectTrait(WaitableTrait.class);
WaitableTrait.Builder waitableTraitBuilder = (WaitableTrait.Builder) waiterTrait.toBuilder();
for (Map.Entry<String, Waiter> entry : waiterTrait.getWaiters().entrySet()) {
String name = entry.getKey();
Waiter waiter = entry.getValue();
Waiter.Builder waiterBuilder = (Waiter.Builder) waiter.toBuilder();
waiterBuilder.clearAcceptors();
for (Acceptor acceptor : waiter.getAcceptors()) {
ObjectNode acceptorNode = acceptor.toNode().expectObjectNode();
Matcher matcher = acceptor.getMatcher();
if (matcher instanceof Matcher.ErrorTypeMember) {
ObjectNode matcherNode = matcher.toNode().expectObjectNode();

String errorCode = matcherNode.expectStringMember("errorType").getValue();
if (errorCodeToShapeId.containsKey(errorCode)) {
matcherNode = matcherNode.toBuilder()
.withMember("errorType", errorCodeToShapeId.get(errorCode))
.build();

acceptorNode = acceptorNode.toBuilder()
.withMember("matcher", matcherNode)
.build();
}
}
waiterBuilder.addAcceptor(Acceptor.fromNode(acceptorNode));
}
waitableTraitBuilder.put(name, waiterBuilder.build());
}
operationBuilder.addTrait(waitableTraitBuilder.build());
}
modifiedShapes.add(operationBuilder.build());
}

if (!modifiedShapes.isEmpty()) {
ModelTransformer transformer = ModelTransformer.create();
model = transformer.replaceShapes(model, modifiedShapes);
}

return model;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ software.amazon.smithy.aws.typescript.codegen.AddDocumentClientPlugin
software.amazon.smithy.aws.typescript.codegen.AddEndpointDiscoveryPlugin
software.amazon.smithy.aws.typescript.codegen.AddHttpChecksumDependency
software.amazon.smithy.aws.typescript.codegen.AddSigv4aPlugin
software.amazon.smithy.aws.typescript.codegen.ProcessAwsQueryWaiters
software.amazon.smithy.aws.typescript.codegen.auth.http.integration.AwsSdkCustomizeHttpBearerTokenAuth
software.amazon.smithy.aws.typescript.codegen.auth.http.integration.SupportSigV4Auth
software.amazon.smithy.aws.typescript.codegen.auth.http.integration.AwsSdkCustomizeSigV4Auth
Expand Down

0 comments on commit b92df20

Please sign in to comment.