Skip to content

Commit ea8e070

Browse files
committed
Merge branch 'main' into dependabot/go_modules/aws-sdk-go-v2-0f90faaf8d
2 parents 7c8c9c7 + 8914028 commit ea8e070

18 files changed

+625
-62
lines changed

.changelog/44473.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:enhancement
2+
resource/aws_route53recoverycontrolconfig_cluster: Add tagging support
3+
```
4+
5+
```release-note:enhancement
6+
resource/aws_route53recoverycontrolconfig_control_panel: Add tagging support
7+
```
8+
9+
```release-note:enhancement
10+
resource/aws_route53recoverycontrolconfig_safety_rule: Add tagging support
11+
```

.changelog/44489.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
resource/aws_cloudwatch_event_rule: Do not retry on `LimitExceededException`
3+
```

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ require (
301301
github.com/hashicorp/terraform-plugin-mux v0.21.0
302302
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
303303
github.com/hashicorp/terraform-plugin-testing v1.14.0-beta.1
304-
github.com/jaswdr/faker/v2 v2.8.0
304+
github.com/jaswdr/faker/v2 v2.8.1
305305
github.com/jmespath/go-jmespath v0.4.0
306306
github.com/mattbaird/jsonpatch v0.0.0-20240118010651-0ba75a80ca38
307307
github.com/mitchellh/copystructure v1.2.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,8 +698,8 @@ github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq
698698
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
699699
github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM=
700700
github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
701-
github.com/jaswdr/faker/v2 v2.8.0 h1:3AxdXW9U7dJmWckh/P0YgRbNlCcVsTyrUNUnLVP9b3Q=
702-
github.com/jaswdr/faker/v2 v2.8.0/go.mod h1:jZq+qzNQr8/P+5fHd9t3txe2GNPnthrTfohtnJ7B+68=
701+
github.com/jaswdr/faker/v2 v2.8.1 h1:2AcPgHDBXYQregFUH9LgVZKfFupc4SIquYhp29sf5wQ=
702+
github.com/jaswdr/faker/v2 v2.8.1/go.mod h1:jZq+qzNQr8/P+5fHd9t3txe2GNPnthrTfohtnJ7B+68=
703703
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
704704
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
705705
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package events
5+
6+
import (
7+
"context"
8+
9+
"github.com/aws/aws-sdk-go-v2/aws"
10+
"github.com/aws/aws-sdk-go-v2/aws/retry"
11+
"github.com/aws/aws-sdk-go-v2/service/eventbridge"
12+
awstypes "github.com/aws/aws-sdk-go-v2/service/eventbridge/types"
13+
"github.com/hashicorp/terraform-plugin-log/tflog"
14+
"github.com/hashicorp/terraform-provider-aws/internal/conns"
15+
"github.com/hashicorp/terraform-provider-aws/internal/errs"
16+
"github.com/hashicorp/terraform-provider-aws/internal/vcr"
17+
)
18+
19+
func (p *servicePackage) withExtraOptions(ctx context.Context, config map[string]any) []func(*eventbridge.Options) {
20+
cfg := *(config["aws_sdkv2_config"].(*aws.Config))
21+
22+
return []func(*eventbridge.Options){
23+
func(o *eventbridge.Options) {
24+
retryables := []retry.IsErrorRetryable{
25+
retry.IsErrorRetryableFunc(func(err error) aws.Ternary {
26+
if errs.IsAErrorMessageContains[*awstypes.LimitExceededException](err, "The requested resource exceeds the maximum number allowed") {
27+
return aws.FalseTernary
28+
}
29+
return aws.UnknownTernary // Delegate to configured Retryer.
30+
}),
31+
}
32+
// Include go-vcr retryable to prevent generated client retryer from being overridden
33+
if inContext, ok := conns.FromContext(ctx); ok && inContext.VCREnabled() {
34+
tflog.Info(ctx, "overriding retry behavior to immediately return VCR errors")
35+
retryables = append(retryables, vcr.InteractionNotFoundRetryableFunc)
36+
}
37+
38+
o.Retryer = conns.AddIsErrorRetryables(cfg.Retryer().(aws.RetryerV2), retryables...)
39+
},
40+
}
41+
}

internal/service/route53recoverycontrolconfig/cluster.go

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ import (
1818
"github.com/hashicorp/terraform-provider-aws/internal/enum"
1919
"github.com/hashicorp/terraform-provider-aws/internal/errs"
2020
"github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag"
21+
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
2122
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
2223
"github.com/hashicorp/terraform-provider-aws/names"
2324
)
2425

2526
// @SDKResource("aws_route53recoverycontrolconfig_cluster", name="Cluster")
27+
// @Tags(identifierAttribute="arn")
2628
func resourceCluster() *schema.Resource {
2729
return &schema.Resource{
2830
CreateWithoutTimeout: resourceClusterCreate,
@@ -69,6 +71,8 @@ func resourceCluster() *schema.Resource {
6971
Type: schema.TypeString,
7072
Computed: true,
7173
},
74+
names.AttrTags: tftags.TagsSchema(),
75+
names.AttrTagsAll: tftags.TagsSchemaComputed(),
7276
},
7377
}
7478
}
@@ -103,6 +107,10 @@ func resourceClusterCreate(ctx context.Context, d *schema.ResourceData, meta any
103107
return sdkdiag.AppendErrorf(diags, "waiting for Route53 Recovery Control Config Cluster (%s) to be Deployed: %s", d.Id(), err)
104108
}
105109

110+
if err := createTags(ctx, conn, d.Id(), getTagsIn(ctx)); err != nil {
111+
return sdkdiag.AppendErrorf(diags, "setting Route53 Recovery Control Config Cluster (%s) tags: %s", d.Id(), err)
112+
}
113+
106114
return append(diags, resourceClusterRead(ctx, d, meta)...)
107115
}
108116

@@ -138,26 +146,28 @@ func resourceClusterUpdate(ctx context.Context, d *schema.ResourceData, meta any
138146
var diags diag.Diagnostics
139147
conn := meta.(*conns.AWSClient).Route53RecoveryControlConfigClient(ctx)
140148

141-
input := &r53rcc.UpdateClusterInput{
142-
ClusterArn: aws.String(d.Id()),
143-
}
149+
if d.HasChangesExcept(names.AttrTags, names.AttrTagsAll) {
150+
input := &r53rcc.UpdateClusterInput{
151+
ClusterArn: aws.String(d.Id()),
152+
}
144153

145-
if d.HasChanges("network_type") {
146-
input.NetworkType = awstypes.NetworkType(d.Get("network_type").(string))
147-
}
154+
if d.HasChanges("network_type") {
155+
input.NetworkType = awstypes.NetworkType(d.Get("network_type").(string))
156+
}
148157

149-
output, err := conn.UpdateCluster(ctx, input)
158+
output, err := conn.UpdateCluster(ctx, input)
150159

151-
if err != nil {
152-
return sdkdiag.AppendErrorf(diags, "updating Route53 Recovery Control Config Cluster: %s", err)
153-
}
160+
if err != nil {
161+
return sdkdiag.AppendErrorf(diags, "updating Route53 Recovery Control Config Cluster: %s", err)
162+
}
154163

155-
if output == nil || output.Cluster == nil {
156-
return sdkdiag.AppendErrorf(diags, "updating Route53 Recovery Control Config Cluster: empty response")
157-
}
164+
if output == nil || output.Cluster == nil {
165+
return sdkdiag.AppendErrorf(diags, "updating Route53 Recovery Control Config Cluster: empty response")
166+
}
158167

159-
if _, err := waitClusterUpdated(ctx, conn, d.Id()); err != nil {
160-
return sdkdiag.AppendErrorf(diags, "waiting for Route53 Recovery Control Config Cluster (%s) to be Updated: %s", d.Id(), err)
168+
if _, err := waitClusterUpdated(ctx, conn, d.Id()); err != nil {
169+
return sdkdiag.AppendErrorf(diags, "waiting for Route53 Recovery Control Config Cluster (%s) to be Updated: %s", d.Id(), err)
170+
}
161171
}
162172

163173
return append(diags, resourceClusterRead(ctx, d, meta)...)

internal/service/route53recoverycontrolconfig/cluster_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ func testAccCluster_basic(t *testing.T) {
4242
resource.TestCheckResourceAttr(resourceName, names.AttrStatus, "DEPLOYED"),
4343
resource.TestCheckResourceAttr(resourceName, "cluster_endpoints.#", "5"),
4444
resource.TestCheckResourceAttr(resourceName, "network_type", string(awstypes.NetworkTypeIpv4)),
45+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, "0"),
46+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsAllPercent, "0"),
4547
),
4648
},
4749
{
@@ -114,6 +116,65 @@ func testAccCluster_networkType(t *testing.T) {
114116
})
115117
}
116118

119+
func testAccCluster_tags(t *testing.T) {
120+
ctx := acctest.Context(t)
121+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
122+
resourceName := "aws_route53recoverycontrolconfig_cluster.test"
123+
124+
resource.Test(t, resource.TestCase{
125+
PreCheck: func() {
126+
acctest.PreCheck(ctx, t)
127+
acctest.PreCheckPartitionHasService(t, names.Route53RecoveryControlConfigEndpointID)
128+
},
129+
ErrorCheck: acctest.ErrorCheck(t, names.Route53RecoveryControlConfigServiceID),
130+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
131+
CheckDestroy: testAccCheckClusterDestroy(ctx),
132+
Steps: []resource.TestStep{
133+
{
134+
Config: testAccClusterConfig_tags1(rName, acctest.CtKey1, acctest.CtValue1),
135+
Check: resource.ComposeTestCheckFunc(
136+
testAccCheckClusterExists(ctx, resourceName),
137+
resource.TestCheckResourceAttr(resourceName, names.AttrName, rName),
138+
resource.TestCheckResourceAttr(resourceName, names.AttrStatus, "DEPLOYED"),
139+
resource.TestCheckResourceAttr(resourceName, "cluster_endpoints.#", "5"),
140+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, "1"),
141+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey1, acctest.CtValue1),
142+
),
143+
},
144+
{
145+
ResourceName: resourceName,
146+
ImportState: true,
147+
ImportStateVerify: true,
148+
ImportStateVerifyIgnore: []string{"cluster_endpoints"},
149+
},
150+
151+
{
152+
Config: testAccClusterConfig_tags2(rName, acctest.CtKey1, acctest.CtValue1Updated, acctest.CtKey2, acctest.CtValue2),
153+
Check: resource.ComposeTestCheckFunc(
154+
testAccCheckClusterExists(ctx, resourceName),
155+
resource.TestCheckResourceAttr(resourceName, names.AttrName, rName),
156+
resource.TestCheckResourceAttr(resourceName, names.AttrStatus, "DEPLOYED"),
157+
resource.TestCheckResourceAttr(resourceName, "cluster_endpoints.#", "5"),
158+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, "2"),
159+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey1, acctest.CtValue1Updated),
160+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey2, acctest.CtValue2),
161+
),
162+
},
163+
{
164+
Config: testAccClusterConfig_tags1(rName, acctest.CtKey2, acctest.CtValue2),
165+
Check: resource.ComposeTestCheckFunc(
166+
testAccCheckClusterExists(ctx, resourceName),
167+
resource.TestCheckResourceAttr(resourceName, names.AttrName, rName),
168+
resource.TestCheckResourceAttr(resourceName, names.AttrStatus, "DEPLOYED"),
169+
resource.TestCheckResourceAttr(resourceName, "cluster_endpoints.#", "5"),
170+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, "1"),
171+
resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey2, acctest.CtValue2),
172+
),
173+
},
174+
},
175+
})
176+
}
177+
117178
func testAccCluster_disappears(t *testing.T) {
118179
ctx := acctest.Context(t)
119180
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
@@ -197,3 +258,26 @@ resource "aws_route53recoverycontrolconfig_cluster" "test" {
197258
}
198259
`, rName, networkType)
199260
}
261+
262+
func testAccClusterConfig_tags1(rName, tagKey1, tagValue1 string) string {
263+
return fmt.Sprintf(`
264+
resource "aws_route53recoverycontrolconfig_cluster" "test" {
265+
name = %[1]q
266+
tags = {
267+
%[2]q = %[3]q
268+
}
269+
}
270+
`, rName, tagKey1, tagValue1)
271+
}
272+
273+
func testAccClusterConfig_tags2(rName, tagKey1, tagValue1, tagKey2, tagValue2 string) string {
274+
return fmt.Sprintf(`
275+
resource "aws_route53recoverycontrolconfig_cluster" "test" {
276+
name = %[1]q
277+
tags = {
278+
%[2]q = %[3]q
279+
%[4]q = %[5]q
280+
}
281+
}
282+
`, rName, tagKey1, tagValue1, tagKey2, tagValue2)
283+
}

internal/service/route53recoverycontrolconfig/control_panel.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ import (
1717
"github.com/hashicorp/terraform-provider-aws/internal/conns"
1818
"github.com/hashicorp/terraform-provider-aws/internal/errs"
1919
"github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag"
20+
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
2021
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
2122
"github.com/hashicorp/terraform-provider-aws/names"
2223
)
2324

2425
// @SDKResource("aws_route53recoverycontrolconfig_control_panel", name="Control Panel")
26+
// @Tags(identifierAttribute="arn")
2527
func resourceControlPanel() *schema.Resource {
2628
return &schema.Resource{
2729
CreateWithoutTimeout: resourceControlPanelCreate,
@@ -57,6 +59,8 @@ func resourceControlPanel() *schema.Resource {
5759
Type: schema.TypeString,
5860
Computed: true,
5961
},
62+
names.AttrTags: tftags.TagsSchema(),
63+
names.AttrTagsAll: tftags.TagsSchemaComputed(),
6064
},
6165
}
6266
}
@@ -88,6 +92,10 @@ func resourceControlPanelCreate(ctx context.Context, d *schema.ResourceData, met
8892
return sdkdiag.AppendErrorf(diags, "waiting for Route53 Recovery Control Config Control Panel (%s) to be Deployed: %s", d.Id(), err)
8993
}
9094

95+
if err := createTags(ctx, conn, d.Id(), getTagsIn(ctx)); err != nil {
96+
return sdkdiag.AppendErrorf(diags, "setting Route53 Recovery Control Config Control Panel (%s) tags: %s", d.Id(), err)
97+
}
98+
9199
return append(diags, resourceControlPanelRead(ctx, d, meta)...)
92100
}
93101

@@ -121,15 +129,17 @@ func resourceControlPanelUpdate(ctx context.Context, d *schema.ResourceData, met
121129
var diags diag.Diagnostics
122130
conn := meta.(*conns.AWSClient).Route53RecoveryControlConfigClient(ctx)
123131

124-
input := &r53rcc.UpdateControlPanelInput{
125-
ControlPanelName: aws.String(d.Get(names.AttrName).(string)),
126-
ControlPanelArn: aws.String(d.Get(names.AttrARN).(string)),
127-
}
132+
if d.HasChangesExcept(names.AttrTags, names.AttrTagsAll) {
133+
input := &r53rcc.UpdateControlPanelInput{
134+
ControlPanelName: aws.String(d.Get(names.AttrName).(string)),
135+
ControlPanelArn: aws.String(d.Get(names.AttrARN).(string)),
136+
}
128137

129-
_, err := conn.UpdateControlPanel(ctx, input)
138+
_, err := conn.UpdateControlPanel(ctx, input)
130139

131-
if err != nil {
132-
return sdkdiag.AppendErrorf(diags, "updating Route53 Recovery Control Config Control Panel: %s", err)
140+
if err != nil {
141+
return sdkdiag.AppendErrorf(diags, "updating Route53 Recovery Control Config Control Panel: %s", err)
142+
}
133143
}
134144

135145
return append(diags, resourceControlPanelRead(ctx, d, meta)...)

0 commit comments

Comments
 (0)