Skip to content

Commit 9c13138

Browse files
committed
r/aws_s3control_bucket_policy: Switch to 'WithoutTimeout' CRUD handlers (#15090).
Acceptance test output: % make testacc TESTARGS='-run=TestAccS3ControlBucketPolicy_' PKG=s3control ACCTEST_PARALLELISM=3 ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./internal/service/s3control/... -v -count 1 -parallel 3 -run=TestAccS3ControlBucketPolicy_ -timeout 180m === RUN TestAccS3ControlBucketPolicy_basic === PAUSE TestAccS3ControlBucketPolicy_basic === RUN TestAccS3ControlBucketPolicy_disappears === PAUSE TestAccS3ControlBucketPolicy_disappears === RUN TestAccS3ControlBucketPolicy_policy === PAUSE TestAccS3ControlBucketPolicy_policy === CONT TestAccS3ControlBucketPolicy_basic === CONT TestAccS3ControlBucketPolicy_policy === CONT TestAccS3ControlBucketPolicy_disappears === CONT TestAccS3ControlBucketPolicy_basic acctest.go:1368: skipping since no Outposts found --- SKIP: TestAccS3ControlBucketPolicy_basic (0.92s) === CONT TestAccS3ControlBucketPolicy_policy acctest.go:1368: skipping since no Outposts found --- SKIP: TestAccS3ControlBucketPolicy_policy (0.94s) === CONT TestAccS3ControlBucketPolicy_disappears acctest.go:1368: skipping since no Outposts found --- SKIP: TestAccS3ControlBucketPolicy_disappears (0.98s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/s3control 6.277s
1 parent af25c23 commit 9c13138

File tree

5 files changed

+74
-88
lines changed

5 files changed

+74
-88
lines changed

internal/provider/provider.go

-1
Original file line numberDiff line numberDiff line change
@@ -2005,7 +2005,6 @@ func New(ctx context.Context) (*schema.Provider, error) {
20052005
"aws_s3_object_copy": s3.ResourceObjectCopy(),
20062006
"aws_s3_bucket_object": s3.ResourceBucketObject(), // DEPRECATED: use aws_s3_object instead
20072007

2008-
"aws_s3control_bucket_policy": s3control.ResourceBucketPolicy(),
20092008
"aws_s3control_multi_region_access_point": s3control.ResourceMultiRegionAccessPoint(),
20102009
"aws_s3control_multi_region_access_point_policy": s3control.ResourceMultiRegionAccessPointPolicy(),
20112010
"aws_s3control_object_lambda_access_point": s3control.ResourceObjectLambdaAccessPoint(),
+60-57
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,33 @@
11
package s3control
22

33
import (
4-
"fmt"
4+
"context"
55
"log"
66

77
"github.com/aws/aws-sdk-go/aws"
88
"github.com/aws/aws-sdk-go/aws/arn"
99
"github.com/aws/aws-sdk-go/service/s3control"
1010
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1113
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1214
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/structure"
1315
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1416
"github.com/hashicorp/terraform-provider-aws/internal/conns"
17+
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
1518
"github.com/hashicorp/terraform-provider-aws/internal/verify"
1619
)
1720

18-
func ResourceBucketPolicy() *schema.Resource {
21+
func init() {
22+
_sp.registerSDKResourceFactory("aws_s3control_bucket_policy", resourceBucketPolicy)
23+
}
24+
25+
func resourceBucketPolicy() *schema.Resource {
1926
return &schema.Resource{
20-
Create: resourceBucketPolicyCreate,
21-
Read: resourceBucketPolicyRead,
22-
Update: resourceBucketPolicyUpdate,
23-
Delete: resourceBucketPolicyDelete,
27+
CreateWithoutTimeout: resourceBucketPolicyCreate,
28+
ReadWithoutTimeout: resourceBucketPolicyRead,
29+
UpdateWithoutTimeout: resourceBucketPolicyUpdate,
30+
DeleteWithoutTimeout: resourceBucketPolicyDelete,
2431

2532
Importer: &schema.ResourceImporter{
2633
State: schema.ImportStatePassthrough,
@@ -47,77 +54,56 @@ func ResourceBucketPolicy() *schema.Resource {
4754
}
4855
}
4956

50-
func resourceBucketPolicyCreate(d *schema.ResourceData, meta interface{}) error {
57+
func resourceBucketPolicyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
5158
conn := meta.(*conns.AWSClient).S3ControlConn()
5259

5360
bucket := d.Get("bucket").(string)
5461

5562
policy, err := structure.NormalizeJsonString(d.Get("policy").(string))
5663

5764
if err != nil {
58-
return fmt.Errorf("policy (%s) is invalid JSON: %w", d.Get("policy").(string), err)
65+
return diag.Errorf("policy (%s) is invalid JSON: %s", d.Get("policy").(string), err)
5966
}
6067

6168
input := &s3control.PutBucketPolicyInput{
6269
Bucket: aws.String(bucket),
6370
Policy: aws.String(policy),
6471
}
6572

66-
_, err = conn.PutBucketPolicy(input)
73+
_, err = conn.PutBucketPolicyWithContext(ctx, input)
6774

6875
if err != nil {
69-
return fmt.Errorf("error creating S3 Control Bucket Policy (%s): %w", bucket, err)
76+
return diag.Errorf("creating S3 Control Bucket Policy (%s): %s", bucket, err)
7077
}
7178

7279
d.SetId(bucket)
7380

74-
return resourceBucketPolicyRead(d, meta)
81+
return resourceBucketPolicyRead(ctx, d, meta)
7582
}
7683

77-
func resourceBucketPolicyRead(d *schema.ResourceData, meta interface{}) error {
84+
func resourceBucketPolicyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
7885
conn := meta.(*conns.AWSClient).S3ControlConn()
7986

8087
parsedArn, err := arn.Parse(d.Id())
8188

8289
if err != nil {
83-
return fmt.Errorf("error parsing S3 Control Bucket ARN (%s): %w", d.Id(), err)
90+
return diag.FromErr(err)
8491
}
8592

8693
if parsedArn.AccountID == "" {
87-
return fmt.Errorf("error parsing S3 Control Bucket ARN (%s): unknown format", d.Id())
88-
}
89-
90-
input := &s3control.GetBucketPolicyInput{
91-
AccountId: aws.String(parsedArn.AccountID),
92-
Bucket: aws.String(d.Id()),
94+
return diag.Errorf("parsing S3 Control Bucket ARN (%s): unknown format", d.Id())
9395
}
9496

95-
output, err := conn.GetBucketPolicy(input)
97+
output, err := FindBucketPolicyByTwoPartKey(ctx, conn, parsedArn.AccountID, d.Id())
9698

97-
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, "NoSuchBucket") {
98-
log.Printf("[WARN] S3 Control Bucket Policy (%s) not found, removing from state", d.Id())
99-
d.SetId("")
100-
return nil
101-
}
102-
103-
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, "NoSuchBucketPolicy") {
104-
log.Printf("[WARN] S3 Control Bucket Policy (%s) not found, removing from state", d.Id())
105-
d.SetId("")
106-
return nil
107-
}
108-
109-
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, "NoSuchOutpost") {
99+
if !d.IsNewResource() && tfresource.NotFound(err) {
110100
log.Printf("[WARN] S3 Control Bucket Policy (%s) not found, removing from state", d.Id())
111101
d.SetId("")
112102
return nil
113103
}
114104

115105
if err != nil {
116-
return fmt.Errorf("error reading S3 Control Bucket Policy (%s): %w", d.Id(), err)
117-
}
118-
119-
if output == nil {
120-
return fmt.Errorf("error reading S3 Control Bucket Policy (%s): empty response", d.Id())
106+
return diag.Errorf("reading S3 Control Bucket Policy (%s): %s", d.Id(), err)
121107
}
122108

123109
d.Set("bucket", d.Id())
@@ -126,7 +112,7 @@ func resourceBucketPolicyRead(d *schema.ResourceData, meta interface{}) error {
126112
policyToSet, err := verify.PolicyToSet(d.Get("policy").(string), aws.StringValue(output.Policy))
127113

128114
if err != nil {
129-
return err
115+
return diag.FromErr(err)
130116
}
131117

132118
d.Set("policy", policyToSet)
@@ -137,60 +123,77 @@ func resourceBucketPolicyRead(d *schema.ResourceData, meta interface{}) error {
137123
return nil
138124
}
139125

140-
func resourceBucketPolicyUpdate(d *schema.ResourceData, meta interface{}) error {
126+
func resourceBucketPolicyUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
141127
conn := meta.(*conns.AWSClient).S3ControlConn()
142128

143129
policy, err := structure.NormalizeJsonString(d.Get("policy").(string))
144130

145131
if err != nil {
146-
return fmt.Errorf("policy (%s) is invalid JSON: %w", d.Get("policy").(string), err)
132+
return diag.Errorf("policy (%s) is invalid JSON: %s", d.Get("policy").(string), err)
147133
}
148134

149135
input := &s3control.PutBucketPolicyInput{
150136
Bucket: aws.String(d.Id()),
151137
Policy: aws.String(policy),
152138
}
153139

154-
_, err = conn.PutBucketPolicy(input)
140+
_, err = conn.PutBucketPolicyWithContext(ctx, input)
155141

156142
if err != nil {
157-
return fmt.Errorf("error updating S3 Control Bucket Policy (%s): %w", d.Id(), err)
143+
return diag.Errorf("updating S3 Control Bucket Policy (%s): %s", d.Id(), err)
158144
}
159145

160-
return resourceBucketPolicyRead(d, meta)
146+
return resourceBucketPolicyRead(ctx, d, meta)
161147
}
162148

163-
func resourceBucketPolicyDelete(d *schema.ResourceData, meta interface{}) error {
149+
func resourceBucketPolicyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
164150
conn := meta.(*conns.AWSClient).S3ControlConn()
165151

166152
parsedArn, err := arn.Parse(d.Id())
167153

168154
if err != nil {
169-
return fmt.Errorf("error parsing S3 Control Bucket ARN (%s): %w", d.Id(), err)
155+
return diag.FromErr(err)
170156
}
171157

172-
input := &s3control.DeleteBucketPolicyInput{
158+
log.Printf("[DEBUG] Deleting S3 Control Bucket Policy: %s", d.Id())
159+
_, err = conn.DeleteBucketPolicyWithContext(ctx, &s3control.DeleteBucketPolicyInput{
173160
AccountId: aws.String(parsedArn.AccountID),
174161
Bucket: aws.String(d.Id()),
175-
}
176-
177-
_, err = conn.DeleteBucketPolicy(input)
162+
})
178163

179-
if tfawserr.ErrCodeEquals(err, "NoSuchBucket") {
164+
if tfawserr.ErrCodeEquals(err, errCodeNoSuchBucket, errCodeNoSuchBucketPolicy, errCodeNoSuchOutpost) {
180165
return nil
181166
}
182167

183-
if tfawserr.ErrCodeEquals(err, "NoSuchBucketPolicy") {
184-
return nil
168+
if err != nil {
169+
return diag.Errorf("deleting S3 Control Bucket Policy (%s): %s", d.Id(), err)
185170
}
186171

187-
if tfawserr.ErrCodeEquals(err, "NoSuchOutpost") {
188-
return nil
172+
return nil
173+
}
174+
175+
func FindBucketPolicyByTwoPartKey(ctx context.Context, conn *s3control.S3Control, accountID, bucket string) (*s3control.GetBucketPolicyOutput, error) {
176+
input := &s3control.GetBucketPolicyInput{
177+
AccountId: aws.String(accountID),
178+
Bucket: aws.String(bucket),
179+
}
180+
181+
output, err := conn.GetBucketPolicyWithContext(ctx, input)
182+
183+
if tfawserr.ErrCodeEquals(err, errCodeNoSuchBucket, errCodeNoSuchBucketPolicy, errCodeNoSuchOutpost) {
184+
return nil, &resource.NotFoundError{
185+
LastError: err,
186+
LastRequest: input,
187+
}
189188
}
190189

191190
if err != nil {
192-
return fmt.Errorf("error deleting S3 Control Bucket Policy (%s): %w", d.Id(), err)
191+
return nil, err
193192
}
194193

195-
return nil
194+
if output == nil {
195+
return nil, tfresource.NewEmptyResultError(input)
196+
}
197+
198+
return output, nil
196199
}

internal/service/s3control/bucket_policy_test.go

+12-30
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package s3control_test
22

33
import (
4+
"context"
45
"fmt"
56
"regexp"
67
"testing"
78

8-
"github.com/aws/aws-sdk-go/aws"
99
"github.com/aws/aws-sdk-go/aws/arn"
1010
"github.com/aws/aws-sdk-go/service/s3control"
11-
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
1211
sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
1312
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1413
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1514
"github.com/hashicorp/terraform-provider-aws/internal/acctest"
1615
"github.com/hashicorp/terraform-provider-aws/internal/conns"
1716
tfs3control "github.com/hashicorp/terraform-provider-aws/internal/service/s3control"
17+
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
1818
)
1919

2020
func TestAccS3ControlBucketPolicy_basic(t *testing.T) {
@@ -110,63 +110,45 @@ func testAccCheckBucketPolicyDestroy(s *terraform.State) error {
110110
parsedArn, err := arn.Parse(rs.Primary.ID)
111111

112112
if err != nil {
113-
return fmt.Errorf("error parsing S3 Control Bucket ARN (%s): %w", rs.Primary.ID, err)
114-
}
115-
116-
input := &s3control.GetBucketPolicyInput{
117-
AccountId: aws.String(parsedArn.AccountID),
118-
Bucket: aws.String(rs.Primary.ID),
119-
}
120-
121-
_, err = conn.GetBucketPolicy(input)
122-
123-
if tfawserr.ErrCodeEquals(err, "NoSuchBucket") {
124-
continue
113+
return err
125114
}
126115

127-
if tfawserr.ErrCodeEquals(err, "NoSuchBucketPolicy") {
128-
continue
129-
}
116+
_, err = tfs3control.FindBucketPolicyByTwoPartKey(context.Background(), conn, parsedArn.AccountID, rs.Primary.ID)
130117

131-
if tfawserr.ErrCodeEquals(err, "NoSuchOutpost") {
118+
if tfresource.NotFound(err) {
132119
continue
133120
}
134121

135122
if err != nil {
136123
return err
137124
}
138125

139-
return fmt.Errorf("S3 Control Bucket Policy (%s) still exists", rs.Primary.ID)
126+
return fmt.Errorf("S3 Control Bucket Policy %s still exists", rs.Primary.ID)
140127
}
141128

142129
return nil
143130
}
144131

145-
func testAccCheckBucketPolicyExists(resourceName string) resource.TestCheckFunc {
132+
func testAccCheckBucketPolicyExists(n string) resource.TestCheckFunc {
146133
return func(s *terraform.State) error {
147-
rs, ok := s.RootModule().Resources[resourceName]
134+
rs, ok := s.RootModule().Resources[n]
148135
if !ok {
149-
return fmt.Errorf("not found: %s", resourceName)
136+
return fmt.Errorf("Not found: %s", n)
150137
}
151138

152139
if rs.Primary.ID == "" {
153-
return fmt.Errorf("no resource ID is set")
140+
return fmt.Errorf("No S3 Control Bucket Policy ID is set")
154141
}
155142

156143
conn := acctest.Provider.Meta().(*conns.AWSClient).S3ControlConn()
157144

158145
parsedArn, err := arn.Parse(rs.Primary.ID)
159146

160147
if err != nil {
161-
return fmt.Errorf("error parsing S3 Control Bucket ARN (%s): %w", rs.Primary.ID, err)
162-
}
163-
164-
input := &s3control.GetBucketPolicyInput{
165-
AccountId: aws.String(parsedArn.AccountID),
166-
Bucket: aws.String(rs.Primary.ID),
148+
return err
167149
}
168150

169-
_, err = conn.GetBucketPolicy(input)
151+
_, err = tfs3control.FindBucketPolicyByTwoPartKey(context.Background(), conn, parsedArn.AccountID, rs.Primary.ID)
170152

171153
return err
172154
}

internal/service/s3control/errors.go

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const (
88
errCodeNoSuchAccessPointPolicy = "NoSuchAccessPointPolicy"
99
errCodeNoSuchAsyncRequest = "NoSuchAsyncRequest"
1010
errCodeNoSuchBucket = "NoSuchBucket"
11+
errCodeNoSuchBucketPolicy = "NoSuchBucketPolicy"
1112
errCodeNoSuchLifecycleConfiguration = "NoSuchLifecycleConfiguration"
1213
errCodeNoSuchMultiRegionAccessPoint = "NoSuchMultiRegionAccessPoint"
1314
errCodeNoSuchOutpost = "NoSuchOutpost"

internal/service/s3control/exports_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ var (
77
ResourceAccountPublicAccessBlock = resourceAccountPublicAccessBlock
88
ResourceBucket = resourceBucket
99
ResourceBucketLifecycleConfiguration = resourceBucketLifecycleConfiguration
10+
ResourceBucketPolicy = resourceBucketPolicy
1011
ResourceStorageLensConfiguration = resourceStorageLensConfiguration
1112
)

0 commit comments

Comments
 (0)