Skip to content

Commit 0f1866c

Browse files
committed
chore(codegen): populate variants in endpoints hashes
1 parent 71b8cce commit 0f1866c

File tree

1 file changed

+77
-31
lines changed
  • codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen

1 file changed

+77
-31
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/EndpointGenerator.java

Lines changed: 77 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

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

18+
import java.util.ArrayList;
19+
import java.util.Collections;
1820
import java.util.List;
1921
import java.util.Map;
2022
import java.util.Optional;
@@ -24,14 +26,14 @@
2426
import software.amazon.smithy.aws.traits.ServiceTrait;
2527
import software.amazon.smithy.aws.traits.auth.SigV4Trait;
2628
import software.amazon.smithy.codegen.core.CodegenException;
29+
import software.amazon.smithy.model.node.ArrayNode;
2730
import software.amazon.smithy.model.node.Node;
2831
import software.amazon.smithy.model.node.ObjectNode;
2932
import software.amazon.smithy.model.node.StringNode;
3033
import software.amazon.smithy.model.shapes.ServiceShape;
3134
import software.amazon.smithy.typescript.codegen.TypeScriptDependency;
3235
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
3336
import software.amazon.smithy.utils.IoUtils;
34-
import software.amazon.smithy.utils.OptionalUtils;
3537
import software.amazon.smithy.utils.SmithyInternalApi;
3638

3739
/**
@@ -90,14 +92,18 @@ private void loadServiceEndpoints() {
9092

9193
for (Map.Entry<String, Node> entry : endpointMap.getStringMap().entrySet()) {
9294
ObjectNode config = entry.getValue().expectObjectNode();
93-
if (config.containsMember("hostname")) {
94-
// Resolve the hostname.
95-
String hostName = config.expectStringMember("hostname").getValue();
96-
hostName = hostName.replace("{dnsSuffix}", dnsSuffix);
97-
hostName = hostName.replace("{service}", endpointPrefix);
98-
hostName = hostName.replace("{region}", entry.getKey());
99-
config = config.withMember("hostname", hostName);
100-
endpoints.put(entry.getKey(), config);
95+
// TODO: Do not populate config if "deprecated" is present, after fully switching to variants.
96+
if (config.containsMember("hostname") || config.containsMember("variants")) {
97+
String hostname = config.getStringMemberOrDefault("hostname", partition.hostnameTemplate);
98+
String resolvedHostname = getResolvedHostname(hostname, dnsSuffix, endpointPrefix, entry.getKey());
99+
100+
ArrayNode variants = config.getArrayMember("variants").orElse(ArrayNode.fromNodes());
101+
ArrayNode defaultVariant = ArrayNode.fromNodes(getDefaultVariant(resolvedHostname));
102+
103+
endpoints.put(entry.getKey(),
104+
config
105+
.withMember("hostname", resolvedHostname)
106+
.withMember("variants", defaultVariant.merge(variants)));
101107
}
102108
}
103109
}
@@ -131,9 +137,13 @@ private void writePartitionHash() {
131137
}
132138
});
133139
writer.write("regionRegex: $S,", partition.regionRegex);
134-
OptionalUtils.ifPresentOrElse(partition.getPartitionEndpoint(),
135-
endpoint -> writer.write("endpoint: $S,", endpoint),
136-
() -> writer.write("hostname: $S,", partition.hostnameTemplate));
140+
141+
// TODO: Remove hostname after fully switching to variants.
142+
writer.write("hostname: $S,", partition.hostnameTemplate);
143+
writer.write("variants: $L,", ArrayNode.prettyPrintJson(partition.getVariants()));
144+
145+
partition.getPartitionEndpoint().ifPresent(
146+
endpoint -> writer.write("endpoint: $S,", endpoint));
137147
});
138148
});
139149
});
@@ -159,28 +169,48 @@ private void writeEndpointProviderFunction() {
159169
}
160170

161171
private void writeEndpointSpecificResolver(String region, ObjectNode resolved) {
162-
if (resolved.containsMember("hostname") || resolved.containsMember("credentialScope")) {
163-
writer.openBlock("$S: {", "},", region, () -> {
164-
String hostname = resolved.expectStringMember("hostname").getValue();
165-
writer.write("hostname: $S,", hostname);
166-
resolved.getObjectMember("credentialScope").ifPresent(scope -> {
167-
scope.getStringMember("region").ifPresent(signingRegion -> {
168-
writer.write("signingRegion: $S,", signingRegion);
169-
});
170-
scope.getStringMember("service").ifPresent(signingService -> {
171-
writer.write("signingService: $S,", signingService);
172-
});
172+
writer.openBlock("$S: {", "},", region, () -> {
173+
// TODO: Remove hostname after fully switching to variants.
174+
String hostname = resolved.expectStringMember("hostname").getValue();
175+
writer.write("hostname: $S,", hostname);
176+
177+
ArrayNode variants = resolved.expectArrayMember("variants");
178+
writer.write("variants: $L,", ArrayNode.prettyPrintJson(variants));
179+
180+
resolved.getObjectMember("credentialScope").ifPresent(scope -> {
181+
scope.getStringMember("region").ifPresent(signingRegion -> {
182+
writer.write("signingRegion: $S,", signingRegion);
183+
});
184+
scope.getStringMember("service").ifPresent(signingService -> {
185+
writer.write("signingService: $S,", signingService);
173186
});
174187
});
175-
}
188+
});
189+
}
190+
191+
private ObjectNode getDefaultVariant(String hostname) {
192+
return ObjectNode
193+
.fromStringMap(Collections.singletonMap("hostname", hostname))
194+
.withMember("tags", ArrayNode.fromStrings(Collections.emptyList()));
195+
}
196+
197+
private String getResolvedHostname(String hostnameTemplate, String dnsSuffix, String service) {
198+
return getResolvedHostname(hostnameTemplate, dnsSuffix, service, "{region}");
199+
}
200+
201+
private String getResolvedHostname(String hostnameTemplate, String dnsSuffix, String service, String region) {
202+
return hostnameTemplate
203+
.replace("{service}", service)
204+
.replace("{region}", region)
205+
.replace("{dnsSuffix}", dnsSuffix);
176206
}
177207

178208
private final class Partition {
179209
final ObjectNode defaults;
180-
final String hostnameTemplate;
181210
final String dnsSuffix;
182211
final String identifier;
183212
final String regionRegex;
213+
final String hostnameTemplate;
184214
private final ObjectNode config;
185215

186216
private Partition(ObjectNode config, String partition) {
@@ -189,15 +219,13 @@ private Partition(ObjectNode config, String partition) {
189219
ObjectNode partitionDefaults = config.expectObjectMember("defaults");
190220
defaults = partitionDefaults.merge(getService().getObjectMember("defaults").orElse(Node.objectNode()));
191221

192-
// Resolve the template to use for this service in this partition.
193-
String template = defaults.expectStringMember("hostname").getValue();
194-
template = template.replace("{service}", endpointPrefix);
195-
template = template.replace("{dnsSuffix}", config.expectStringMember("dnsSuffix").getValue());
196-
hostnameTemplate = template;
197-
198222
dnsSuffix = config.expectStringMember("dnsSuffix").getValue();
199223
identifier = partition;
200224
regionRegex = config.expectStringMember("regionRegex").getValue();
225+
226+
// Resolve the template to use for this service in this partition.
227+
String hostname = defaults.expectStringMember("hostname").getValue();
228+
hostnameTemplate = getResolvedHostname(hostname, dnsSuffix, endpointPrefix);
201229
}
202230

203231
ObjectNode getDefaults() {
@@ -222,6 +250,24 @@ Set<String> getAllRegions() {
222250
return regions;
223251
}
224252

253+
ArrayNode getVariants() {
254+
List<Node> allVariants = new ArrayList<Node>();
255+
256+
allVariants.add(getDefaultVariant(hostnameTemplate));
257+
if (defaults.containsMember("variants")) {
258+
ArrayNode variants = defaults.expectArrayMember("variants");
259+
variants.forEach(variant -> {
260+
ObjectNode variantNode = variant.expectObjectNode();
261+
String hostname = variantNode.expectStringMember("hostname").getValue();
262+
String dnsSuffix = variantNode.getStringMemberOrDefault("dnsSuffix", this.dnsSuffix);
263+
String resolvedHostname = getResolvedHostname(hostname, dnsSuffix, endpointPrefix);
264+
allVariants.add(variantNode.withMember("hostname", resolvedHostname).withoutMember("dnsSuffix"));
265+
});
266+
}
267+
268+
return ArrayNode.fromNodes(allVariants);
269+
}
270+
225271
Optional<String> getPartitionEndpoint() {
226272
ObjectNode service = getService();
227273
// Note: regionalized services always use regionalized endpoints.

0 commit comments

Comments
 (0)