Skip to content

Commit 871fd22

Browse files
authored
Merge pull request #42412 from hashicorp/f-per-resource-override-Region-documentation
Enhanced Region Support guide
2 parents 71e1942 + 31ec88e commit 871fd22

File tree

402 files changed

+1491
-617
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

402 files changed

+1491
-617
lines changed

.ci/semgrep/acctest/naming/naming.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ rules:
2626
regex: '^testAccCheck[a-zA-Z]+Destroy(?!With)Provider'
2727
severity: WARNING
2828

29+
- id: destroy-check-with-region
30+
languages: [go]
31+
message: The check destroy with region function should match the pattern "testAccCheck<Resource>DestroyWithRegion".
32+
paths:
33+
include:
34+
- "internal/**/*_test.go"
35+
patterns:
36+
- pattern: func $FUNCNAME(...) { ... }
37+
- metavariable-regex:
38+
metavariable: "$FUNCNAME"
39+
regex: '^testAccCheck[a-zA-Z]+Destroy(?!With)Region'
40+
severity: WARNING
41+
2942
- id: destroy-check-signature
3043
languages: [go]
3144
message: The check destroy function should have the correct signature
@@ -36,7 +49,7 @@ rules:
3649
- pattern: func $FUNCNAME(...) { ... }
3750
- metavariable-regex:
3851
metavariable: "$FUNCNAME"
39-
regex: "^testAccCheck[a-zA-Z]+Destroy(?!WithProvider)"
52+
regex: "^testAccCheck[a-zA-Z]+Destroy(?!WithProvider)(?!WithRegion)"
4053
- pattern-not: func $FUNCNAME(s *terraform.State) error { ... }
4154
- pattern-not: func $FUNCNAME(...) resource.TestCheckFunc { ... }
4255
severity: WARNING

internal/acctest/acctest.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,6 +1529,19 @@ func CheckWithNamedProviders(f TestCheckWithProviderFunc, providers map[string]*
15291529
}
15301530
}
15311531

1532+
type TestCheckWithRegionFunc func(*terraform.State, string) error
1533+
1534+
func CheckWithRegions(f TestCheckWithRegionFunc, regions ...string) resource.TestCheckFunc {
1535+
return func(s *terraform.State) error {
1536+
for _, region := range regions {
1537+
if err := f(s, region); err != nil {
1538+
return err
1539+
}
1540+
}
1541+
return nil
1542+
}
1543+
}
1544+
15321545
func ErrorCheckSequence(funcs ...resource.ErrorCheckFunc) resource.ErrorCheckFunc {
15331546
return func(err error) error {
15341547
for _, f := range funcs {

internal/service/kms/replica_key_test.go

Lines changed: 77 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestAccKMSReplicaKey_basic(t *testing.T) {
3333
acctest.PreCheckMultipleRegion(t, 2)
3434
},
3535
ErrorCheck: acctest.ErrorCheck(t, names.KMSServiceID),
36-
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesAlternate(ctx, t),
36+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
3737
CheckDestroy: testAccCheckKeyDestroy(ctx),
3838
Steps: []resource.TestStep{
3939
{
@@ -77,7 +77,7 @@ func TestAccKMSReplicaKey_disappears(t *testing.T) {
7777
acctest.PreCheckMultipleRegion(t, 2)
7878
},
7979
ErrorCheck: acctest.ErrorCheck(t, names.KMSServiceID),
80-
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesAlternate(ctx, t),
80+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
8181
CheckDestroy: testAccCheckKeyDestroy(ctx),
8282
Steps: []resource.TestStep{
8383
{
@@ -107,7 +107,7 @@ func TestAccKMSReplicaKey_descriptionAndEnabled(t *testing.T) {
107107
acctest.PreCheckMultipleRegion(t, 2)
108108
},
109109
ErrorCheck: acctest.ErrorCheck(t, names.KMSServiceID),
110-
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesAlternate(ctx, t),
110+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
111111
CheckDestroy: testAccCheckKeyDestroy(ctx),
112112
Steps: []resource.TestStep{
113113
{
@@ -158,7 +158,7 @@ func TestAccKMSReplicaKey_policy(t *testing.T) {
158158
acctest.PreCheckMultipleRegion(t, 2)
159159
},
160160
ErrorCheck: acctest.ErrorCheck(t, names.KMSServiceID),
161-
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesAlternate(ctx, t),
161+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
162162
CheckDestroy: testAccCheckKeyDestroy(ctx),
163163
Steps: []resource.TestStep{
164164
{
@@ -199,7 +199,7 @@ func TestAccKMSReplicaKey_twoReplicas(t *testing.T) {
199199
acctest.PreCheckMultipleRegion(t, 3)
200200
},
201201
ErrorCheck: acctest.ErrorCheck(t, names.KMSServiceID),
202-
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesMultipleRegions(ctx, t, 3),
202+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
203203
CheckDestroy: testAccCheckKeyDestroy(ctx),
204204
Steps: []resource.TestStep{
205205
{
@@ -212,6 +212,51 @@ func TestAccKMSReplicaKey_twoReplicas(t *testing.T) {
212212
})
213213
}
214214

215+
func TestAccKMSReplicaKey_multipleProviders(t *testing.T) {
216+
ctx := acctest.Context(t)
217+
var key awstypes.KeyMetadata
218+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
219+
primaryKeyResourceName := "aws_kms_key.test"
220+
resourceName := "aws_kms_replica_key.test"
221+
222+
resource.ParallelTest(t, resource.TestCase{
223+
PreCheck: func() {
224+
acctest.PreCheck(ctx, t)
225+
acctest.PreCheckMultipleRegion(t, 2)
226+
},
227+
ErrorCheck: acctest.ErrorCheck(t, names.KMSServiceID),
228+
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesAlternate(ctx, t),
229+
CheckDestroy: testAccCheckKeyDestroy(ctx),
230+
Steps: []resource.TestStep{
231+
{
232+
Config: testAccReplicaKeyConfig_multipleProviders(rName),
233+
Check: resource.ComposeTestCheckFunc(
234+
testAccCheckKeyExists(ctx, resourceName, &key),
235+
acctest.MatchResourceAttrRegionalARN(ctx, resourceName, names.AttrARN, "kms", regexache.MustCompile(`key/.+`)),
236+
resource.TestCheckResourceAttr(resourceName, "bypass_policy_lockout_safety_check", acctest.CtFalse),
237+
resource.TestCheckResourceAttr(resourceName, "deletion_window_in_days", "30"),
238+
resource.TestCheckResourceAttr(resourceName, names.AttrDescription, ""),
239+
resource.TestCheckResourceAttr(resourceName, names.AttrEnabled, acctest.CtTrue),
240+
resource.TestCheckResourceAttr(resourceName, "key_rotation_enabled", acctest.CtFalse),
241+
resource.TestCheckResourceAttr(resourceName, "key_spec", "SYMMETRIC_DEFAULT"),
242+
resource.TestMatchResourceAttr(resourceName, names.AttrPolicy, regexache.MustCompile(`Enable IAM User Permissions`)),
243+
resource.TestCheckResourceAttrPair(resourceName, "primary_key_arn", primaryKeyResourceName, names.AttrARN),
244+
),
245+
ConfigStateChecks: []statecheck.StateCheck{
246+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(names.AttrTags), knownvalue.Null()),
247+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(names.AttrTagsAll), knownvalue.MapExact(map[string]knownvalue.Check{})),
248+
},
249+
},
250+
{
251+
ResourceName: resourceName,
252+
ImportState: true,
253+
ImportStateVerify: true,
254+
ImportStateVerifyIgnore: []string{"deletion_window_in_days", "bypass_policy_lockout_safety_check"},
255+
},
256+
},
257+
})
258+
}
259+
215260
func testAccCheckReplicaKeyDestroy(ctx context.Context) resource.TestCheckFunc {
216261
return testAccCheckKeyDestroy(ctx)
217262
}
@@ -221,9 +266,9 @@ func testAccCheckReplicaKeyExists(ctx context.Context, name string, key *awstype
221266
}
222267

223268
func testAccReplicaKeyConfig_basic(rName string) string {
224-
return acctest.ConfigCompose(acctest.ConfigAlternateRegionProvider(), fmt.Sprintf(`
269+
return fmt.Sprintf(`
225270
resource "aws_kms_key" "test" {
226-
provider = awsalternate
271+
region = %[2]q
227272
228273
description = %[1]q
229274
multi_region = true
@@ -234,13 +279,13 @@ resource "aws_kms_key" "test" {
234279
resource "aws_kms_replica_key" "test" {
235280
primary_key_arn = aws_kms_key.test.arn
236281
}
237-
`, rName))
282+
`, rName, acctest.AlternateRegion())
238283
}
239284

240285
func testAccReplicaKeyConfig_descriptionAndEnabled(rName, description string, enabled bool) string {
241-
return acctest.ConfigCompose(acctest.ConfigAlternateRegionProvider(), fmt.Sprintf(`
286+
return fmt.Sprintf(`
242287
resource "aws_kms_key" "test" {
243-
provider = awsalternate
288+
region = %[4]q
244289
245290
description = %[1]q
246291
multi_region = true
@@ -256,13 +301,13 @@ resource "aws_kms_replica_key" "test" {
256301
257302
deletion_window_in_days = 7
258303
}
259-
`, rName, description, enabled))
304+
`, rName, description, enabled, acctest.AlternateRegion())
260305
}
261306

262307
func testAccReplicaKeyConfig_policy(rName, policy string, bypassLockoutCheck bool) string {
263-
return acctest.ConfigCompose(acctest.ConfigAlternateRegionProvider(), fmt.Sprintf(`
308+
return fmt.Sprintf(`
264309
resource "aws_kms_key" "test" {
265-
provider = awsalternate
310+
region = %[4]q
266311
267312
description = %[1]q
268313
multi_region = true
@@ -281,13 +326,13 @@ resource "aws_kms_replica_key" "test" {
281326
282327
policy = %[2]q
283328
}
284-
`, rName, policy, bypassLockoutCheck))
329+
`, rName, policy, bypassLockoutCheck, acctest.AlternateRegion())
285330
}
286331

287332
func testAccReplicaKeyConfig_two(rName string) string {
288-
return acctest.ConfigCompose(acctest.ConfigMultipleRegionProvider(3), fmt.Sprintf(`
333+
return fmt.Sprintf(`
289334
resource "aws_kms_key" "test" {
290-
provider = awsalternate
335+
region = %[2]q
291336
292337
description = %[1]q
293338
multi_region = true
@@ -304,12 +349,27 @@ resource "aws_kms_replica_key" "test1" {
304349
}
305350
306351
resource "aws_kms_replica_key" "test2" {
307-
provider = awsthird
352+
region = %[3]q
308353
309354
description = %[1]q
310355
primary_key_arn = aws_kms_key.test.arn
311356
312357
deletion_window_in_days = 7
313358
}
359+
`, rName, acctest.AlternateRegion(), acctest.ThirdRegion())
360+
}
361+
362+
func testAccReplicaKeyConfig_multipleProviders(rName string) string {
363+
return acctest.ConfigCompose(acctest.ConfigAlternateRegionProvider(), fmt.Sprintf(`
364+
resource "aws_kms_key" "test" {
365+
provider = awsalternate
366+
367+
description = %[1]q
368+
multi_region = true
369+
}
370+
371+
resource "aws_kms_replica_key" "test" {
372+
primary_key_arn = aws_kms_key.test.arn
373+
}
314374
`, rName))
315375
}

0 commit comments

Comments
 (0)