Skip to content

Commit 0404dec

Browse files
Generate account endpoints for DynamoDB requests using ARN-sourced account ID when available
1 parent 93f4d4b commit 0404dec

10 files changed

+21443
-1370
lines changed

generator/ServiceModels/dynamodb/dynamodb-2011-12-05.endpoint-rule-set.json

Lines changed: 540 additions & 159 deletions
Large diffs are not rendered by default.

generator/ServiceModels/dynamodb/dynamodb-2011-12-05.endpoint-tests.json

Lines changed: 7354 additions & 360 deletions
Large diffs are not rendered by default.

generator/ServiceModels/dynamodb/dynamodb-2012-08-10.api.json

Lines changed: 189 additions & 45 deletions
Large diffs are not rendered by default.

generator/ServiceModels/dynamodb/dynamodb-2012-08-10.endpoint-rule-set.json

Lines changed: 540 additions & 159 deletions
Large diffs are not rendered by default.

generator/ServiceModels/dynamodb/dynamodb-2012-08-10.endpoint-tests.json

Lines changed: 7354 additions & 360 deletions
Large diffs are not rendered by default.

generator/ServiceModels/dynamodb/dynamodb-2012-08-10.normal.json

Lines changed: 101 additions & 45 deletions
Large diffs are not rendered by default.

sdk/src/Services/DynamoDBv2/Generated/AmazonDynamoDBEndpointParameters.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,23 @@ public string AccountIdEndpointMode
9393
get { return (string)this["AccountIdEndpointMode"]; }
9494
set { this["AccountIdEndpointMode"] = value; }
9595
}
96+
97+
/// <summary>
98+
/// ResourceArn parameter
99+
/// </summary>
100+
public string ResourceArn
101+
{
102+
get { return (string)this["ResourceArn"]; }
103+
set { this["ResourceArn"] = value; }
104+
}
105+
106+
/// <summary>
107+
/// ResourceArnList parameter
108+
/// </summary>
109+
public IEnumerable<string> ResourceArnList
110+
{
111+
get { return (IEnumerable<string>)this["ResourceArnList"]; }
112+
set { this["ResourceArnList"] = value; }
113+
}
96114
}
97115
}

sdk/src/Services/DynamoDBv2/Generated/Internal/AmazonDynamoDBEndpointProvider.cs

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public Endpoint ResolveEndpoint(EndpointParameters parameters)
5353
["Endpoint"] = parameters["Endpoint"],
5454
["AccountId"] = parameters["AccountId"],
5555
["AccountIdEndpointMode"] = parameters["AccountIdEndpointMode"],
56+
["ResourceArn"] = parameters["ResourceArn"],
57+
["ResourceArnList"] = parameters["ResourceArnList"],
5658
};
5759
if (IsSet(refs["Endpoint"]))
5860
{
@@ -80,23 +82,15 @@ public Endpoint ResolveEndpoint(EndpointParameters parameters)
8082
{
8183
throw new AmazonClientException("Invalid Configuration: Dualstack and local endpoint are not supported");
8284
}
83-
return new Endpoint("http://localhost:8000", InterpolateJson(@"{""authSchemes"":[{""name"":""sigv4"",""signingName"":""dynamodb"",""signingRegion"":""us-east-1""}]}", refs), InterpolateJson(@"", refs));
84-
}
85-
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "required") && !IsSet(refs["AccountId"]))
86-
{
87-
throw new AmazonClientException("AccountIdEndpointMode is required but no AccountID was provided or able to be loaded.");
88-
}
89-
if (IsSet(refs["AccountId"]) && Equals(GetAttr(refs["PartitionResult"], "name"), "aws") && !Equals(refs["UseFIPS"], true) && !Equals(refs["UseDualStack"], true) && !IsValidHostLabel((string)refs["AccountId"], false))
90-
{
91-
throw new AmazonClientException("Credentials-sourced account ID parameter is invalid");
85+
return new Endpoint("http://localhost:8000", InterpolateJson(@"{""authSchemes"":[{""signingRegion"":""us-east-1"",""signingName"":""dynamodb"",""name"":""sigv4""}]}", refs), InterpolateJson(@"", refs));
9286
}
9387
if (Equals(refs["UseFIPS"], true) && Equals(refs["UseDualStack"], true))
9488
{
9589
if (Equals(GetAttr(refs["PartitionResult"], "supportsFIPS"), true) && Equals(GetAttr(refs["PartitionResult"], "supportsDualStack"), true))
9690
{
97-
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "disabled"))
91+
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "required"))
9892
{
99-
return new Endpoint(Interpolate(@"https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
93+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported");
10094
}
10195
return new Endpoint(Interpolate(@"https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
10296
}
@@ -108,15 +102,15 @@ public Endpoint ResolveEndpoint(EndpointParameters parameters)
108102
{
109103
if (Equals(GetAttr(refs["PartitionResult"], "name"), "aws-us-gov"))
110104
{
111-
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "disabled"))
105+
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "required"))
112106
{
113-
return new Endpoint(Interpolate(@"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
107+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported");
114108
}
115109
return new Endpoint(Interpolate(@"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
116110
}
117-
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "disabled"))
111+
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "required"))
118112
{
119-
return new Endpoint(Interpolate(@"https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
113+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported");
120114
}
121115
return new Endpoint(Interpolate(@"https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
122116
}
@@ -126,21 +120,49 @@ public Endpoint ResolveEndpoint(EndpointParameters parameters)
126120
{
127121
if (Equals(GetAttr(refs["PartitionResult"], "supportsDualStack"), true))
128122
{
129-
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "disabled"))
123+
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "required"))
130124
{
131-
return new Endpoint(Interpolate(@"https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
125+
if (!Equals(refs["UseFIPS"], true))
126+
{
127+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported");
128+
}
129+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported");
132130
}
133131
return new Endpoint(Interpolate(@"https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
134132
}
135133
throw new AmazonClientException("DualStack is enabled but this partition does not support DualStack");
136134
}
137-
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "disabled"))
135+
if (IsSet(refs["AccountIdEndpointMode"]) && !Equals(refs["AccountIdEndpointMode"], "disabled") && Equals(GetAttr(refs["PartitionResult"], "name"), "aws") && !Equals(refs["UseFIPS"], true) && !Equals(refs["UseDualStack"], true) && IsSet(refs["ResourceArn"]) && (refs["ParsedArn"] = ParseArn((string)refs["ResourceArn"])) != null && Equals(GetAttr(refs["ParsedArn"], "service"), "dynamodb") && IsValidHostLabel((string)GetAttr(refs["ParsedArn"], "region"), false) && Equals(GetAttr(refs["ParsedArn"], "region"), Interpolate(@"{Region}", refs)) && IsValidHostLabel((string)GetAttr(refs["ParsedArn"], "accountId"), false))
136+
{
137+
return new Endpoint(Interpolate(@"https://{ParsedArn#accountId}.ddb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
138+
}
139+
if (IsSet(refs["AccountIdEndpointMode"]) && !Equals(refs["AccountIdEndpointMode"], "disabled") && Equals(GetAttr(refs["PartitionResult"], "name"), "aws") && !Equals(refs["UseFIPS"], true) && !Equals(refs["UseDualStack"], true) && IsSet(refs["ResourceArnList"]) && (refs["FirstArn"] = GetAttr(refs["ResourceArnList"], "[0]")) != null && (refs["ParsedArn"] = ParseArn((string)refs["FirstArn"])) != null && Equals(GetAttr(refs["ParsedArn"], "service"), "dynamodb") && IsValidHostLabel((string)GetAttr(refs["ParsedArn"], "region"), false) && Equals(GetAttr(refs["ParsedArn"], "region"), Interpolate(@"{Region}", refs)) && IsValidHostLabel((string)GetAttr(refs["ParsedArn"], "accountId"), false))
140+
{
141+
return new Endpoint(Interpolate(@"https://{ParsedArn#accountId}.ddb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
142+
}
143+
if (IsSet(refs["AccountIdEndpointMode"]) && !Equals(refs["AccountIdEndpointMode"], "disabled") && Equals(GetAttr(refs["PartitionResult"], "name"), "aws") && !Equals(refs["UseFIPS"], true) && !Equals(refs["UseDualStack"], true) && IsSet(refs["AccountId"]))
138144
{
139-
return new Endpoint(Interpolate(@"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
145+
if (IsValidHostLabel((string)refs["AccountId"], false))
146+
{
147+
return new Endpoint(Interpolate(@"https://{AccountId}.ddb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
148+
}
149+
throw new AmazonClientException("Credentials-sourced account ID parameter is invalid");
140150
}
141-
if (IsSet(refs["AccountId"]) && Equals(GetAttr(refs["PartitionResult"], "name"), "aws") && !Equals(refs["UseFIPS"], true) && !Equals(refs["UseDualStack"], true))
151+
if (IsSet(refs["AccountIdEndpointMode"]) && Equals(refs["AccountIdEndpointMode"], "required"))
142152
{
143-
return new Endpoint(Interpolate(@"https://{AccountId}.ddb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
153+
if (!Equals(refs["UseFIPS"], true))
154+
{
155+
if (!Equals(refs["UseDualStack"], true))
156+
{
157+
if (Equals(GetAttr(refs["PartitionResult"], "name"), "aws"))
158+
{
159+
throw new AmazonClientException("AccountIdEndpointMode is required but no AccountID was provided or able to be loaded");
160+
}
161+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition");
162+
}
163+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported");
164+
}
165+
throw new AmazonClientException("Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported");
144166
}
145167
return new Endpoint(Interpolate(@"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", refs), InterpolateJson(@"", refs), InterpolateJson(@"", refs));
146168
}

0 commit comments

Comments
 (0)