Skip to content

Commit 4cc20a7

Browse files
committed
Fix test and add handling for resource APIs
1 parent ece590c commit 4cc20a7

2 files changed

Lines changed: 48 additions & 7 deletions

File tree

  • aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler
  • model-bundle/model-bundle-api/src/main/java/software/amazon/smithy/modelbundle/api

aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundlerTest.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99
import static org.junit.jupiter.api.Assertions.assertEquals;
1010
import static org.junit.jupiter.api.Assertions.assertNotEquals;
11+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1112

1213
import java.io.InputStreamReader;
1314
import java.util.Objects;
@@ -17,6 +18,8 @@
1718
import software.amazon.smithy.model.loader.ModelAssembler;
1819
import software.amazon.smithy.model.node.Node;
1920
import software.amazon.smithy.model.shapes.ModelSerializer;
21+
import software.amazon.smithy.model.shapes.OperationShape;
22+
import software.amazon.smithy.model.shapes.ShapeId;
2023

2124
public class AwsServiceBundlerTest {
2225

@@ -35,14 +38,37 @@ public void accessAnalyzer() {
3538
assertNotEquals(0, config.getEndpoints().size());
3639
}
3740

41+
@Test
42+
public void resourceApis() {
43+
var bundler = AwsServiceBundler.builder()
44+
.serviceName("access-analyzer")
45+
.resolver(serviceName -> getModel("accessanalyzer-2019-11-01.json"))
46+
.readOnlyOperations()
47+
.build();
48+
var bundle = bundler.bundle();
49+
var bundleModel = new ModelAssembler().addUnparsedModel("model.json", bundle.getModel())
50+
.disableValidation()
51+
.putProperty(ModelAssembler.ALLOW_UNKNOWN_TRAITS, true)
52+
.assemble()
53+
.unwrap();
54+
//read resource APIS "GET", "LIST" should be present
55+
assertNotNull(bundleModel.expectShape(ShapeId.from("com.amazonaws.accessanalyzer#GetAnalyzer"),
56+
OperationShape.class));
57+
assertNotNull(bundleModel.expectShape(ShapeId.from("com.amazonaws.accessanalyzer#ListAnalyzers"),
58+
OperationShape.class));
59+
60+
//Write APIs should not be present.
61+
assertThat(bundleModel.getShape(ShapeId.from("com.amazonaws.accessanalyzer#DeleteAnalyzer"))).isEmpty();
62+
}
63+
3864
@Test
3965
public void testFilteringApis() {
4066
var filteredOperations = Set.of("GetFindingsStatistics", "GetFindingRecommendation");
4167
var bundler = AwsServiceBundler.builder()
4268
.serviceName("access-analyzer")
4369
.resolver(serviceName -> getModel("accessanalyzer-2019-11-01.json"))
4470
.exposedOperations(filteredOperations)
45-
.build();;
71+
.build();
4672
var bundle = bundler.bundle();
4773
var bundleModel = new ModelAssembler().addUnparsedModel("model.json", bundle.getModel())
4874
.disableValidation()
@@ -106,14 +132,26 @@ void testOnlyOneServiceRetained() {
106132
.blockedPrefixes(ApiStandardTerminology.getWriteApiPrefixes())
107133
.build();
108134
var bundle = bundler.bundle();
109-
var bundleModel = new ModelAssembler().addUnparsedModel("model.json", bundle.getModel())
135+
var bundleModel = new ModelAssembler().addUnparsedModel("bundle.json", bundle.getModel())
110136
.disableValidation()
111137
.putProperty(ModelAssembler.ALLOW_UNKNOWN_TRAITS, true)
112138
.assemble()
113139
.unwrap();
114140
assertThat(bundleModel.getServiceShapes()).hasSize(1);
141+
142+
var serviceShape = bundleModel.getServiceShapes().iterator().next();
143+
144+
assertThat(serviceShape.getId().toString()).isEqualTo(bundle.getServiceName());
145+
//We do not know which service gets picked because AwsServiceBundle chooses the first one it finds.
146+
String excludedNamespace;
147+
if (bundle.getServiceName().equals("com.amazonaws.accessanalyzer#AccessAnalyzer")) {
148+
excludedNamespace = "com.amazonaws.dynamodb";
149+
} else {
150+
excludedNamespace = "com.amazonaws.accessanalyzer";
151+
}
152+
115153
assertThat(bundleModel.getShapeIds()).hasSizeLessThan(totalShapes)
116-
.filteredOn(i -> i.toString().startsWith("com.amazonaws.accessanalyzer"))
154+
.filteredOn(i -> i.toString().startsWith(excludedNamespace))
117155
.isEmpty();
118156
}
119157

model-bundle/model-bundle-api/src/main/java/software/amazon/smithy/modelbundle/api/ModelBundler.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.stream.Collectors;
1515
import software.amazon.smithy.java.logging.InternalLogger;
1616
import software.amazon.smithy.model.Model;
17+
import software.amazon.smithy.model.knowledge.TopDownIndex;
1718
import software.amazon.smithy.model.shapes.AbstractShapeBuilder;
1819
import software.amazon.smithy.model.shapes.OperationShape;
1920
import software.amazon.smithy.model.shapes.ServiceShape;
@@ -54,16 +55,17 @@ protected static Model cleanAndFilterModel(
5455
Set<String> allowedWords,
5556
Set<String> blockedWords
5657
) {
57-
var builder = model.toBuilder();
5858
var allowedService = model.expectShape(allowedServiceId, ServiceShape.class);
5959
var serviceBuilder = allowedService.toBuilder();
60-
var operations = allowedService.getOperations();
60+
61+
var builder = model.toBuilder();
6162
for (var serviceShape : model.getServiceShapes()) {
6263
if (!serviceShape.toShapeId().equals(allowedService.toShapeId())) {
6364
builder.removeShape(serviceShape.toShapeId());
6465
}
6566
}
66-
for (var op : model.getOperationShapes()) {
67+
//This needs to be the TopDownIndex because we need to also consider the resource operations.
68+
for (var op : TopDownIndex.of(model).getContainedOperations(allowedService.toShapeId())) {
6769
var name = op.getId().getName();
6870
var allowed = isAllowed(name, allowedOperations, blockedOperations, allowedWords, blockedWords);
6971
if (allowed) {
@@ -78,7 +80,8 @@ protected static Model cleanAndFilterModel(
7880
var service = serviceBuilder.build();
7981
builder.addShape(service);
8082
cleanDocumentation(service, builder);
81-
return ModelTransformer.create().removeUnreferencedShapes(builder.build());
83+
var transformer = ModelTransformer.create();
84+
return transformer.removeUnreferencedShapes(transformer.removeUnreferencedTraitDefinitions(builder.build()));
8285
}
8386

8487
static boolean isAllowed(

0 commit comments

Comments
 (0)