Skip to content

Commit 723aae3

Browse files
committed
r/aws_s3control_multi_region_access_point & r/aws_s3control_multi_region_access_point_policy: Switch to 'WithoutTimeout' CRUD handlers (#15090).
Acceptance test output: % make testacc TESTARGS='-run=TestAccS3ControlMultiRegionAccessPoint' 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=TestAccS3ControlMultiRegionAccessPoint -timeout 180m === RUN TestAccS3ControlMultiRegionAccessPointDataSource_basic === PAUSE TestAccS3ControlMultiRegionAccessPointDataSource_basic === RUN TestAccS3ControlMultiRegionAccessPointPolicy_basic === PAUSE TestAccS3ControlMultiRegionAccessPointPolicy_basic === RUN TestAccS3ControlMultiRegionAccessPointPolicy_disappears_MultiRegionAccessPoint === PAUSE TestAccS3ControlMultiRegionAccessPointPolicy_disappears_MultiRegionAccessPoint === RUN TestAccS3ControlMultiRegionAccessPointPolicy_details_policy === PAUSE TestAccS3ControlMultiRegionAccessPointPolicy_details_policy === RUN TestAccS3ControlMultiRegionAccessPointPolicy_details_name === PAUSE TestAccS3ControlMultiRegionAccessPointPolicy_details_name === RUN TestAccS3ControlMultiRegionAccessPoint_basic === PAUSE TestAccS3ControlMultiRegionAccessPoint_basic === RUN TestAccS3ControlMultiRegionAccessPoint_disappears === PAUSE TestAccS3ControlMultiRegionAccessPoint_disappears === RUN TestAccS3ControlMultiRegionAccessPoint_PublicAccessBlock === PAUSE TestAccS3ControlMultiRegionAccessPoint_PublicAccessBlock === RUN TestAccS3ControlMultiRegionAccessPoint_name === PAUSE TestAccS3ControlMultiRegionAccessPoint_name === RUN TestAccS3ControlMultiRegionAccessPoint_threeRegions === PAUSE TestAccS3ControlMultiRegionAccessPoint_threeRegions === CONT TestAccS3ControlMultiRegionAccessPointDataSource_basic === CONT TestAccS3ControlMultiRegionAccessPoint_basic === CONT TestAccS3ControlMultiRegionAccessPoint_threeRegions --- PASS: TestAccS3ControlMultiRegionAccessPoint_basic (336.67s) === CONT TestAccS3ControlMultiRegionAccessPoint_name --- PASS: TestAccS3ControlMultiRegionAccessPoint_threeRegions (348.44s) === CONT TestAccS3ControlMultiRegionAccessPoint_PublicAccessBlock --- PASS: TestAccS3ControlMultiRegionAccessPointDataSource_basic (359.54s) === CONT TestAccS3ControlMultiRegionAccessPoint_disappears --- PASS: TestAccS3ControlMultiRegionAccessPoint_disappears (256.99s) === CONT TestAccS3ControlMultiRegionAccessPointPolicy_details_policy --- PASS: TestAccS3ControlMultiRegionAccessPoint_PublicAccessBlock (333.59s) === CONT TestAccS3ControlMultiRegionAccessPointPolicy_details_name --- PASS: TestAccS3ControlMultiRegionAccessPointPolicy_details_policy (265.17s) === CONT TestAccS3ControlMultiRegionAccessPointPolicy_disappears_MultiRegionAccessPoint --- PASS: TestAccS3ControlMultiRegionAccessPoint_name (587.22s) === CONT TestAccS3ControlMultiRegionAccessPointPolicy_basic --- PASS: TestAccS3ControlMultiRegionAccessPointPolicy_disappears_MultiRegionAccessPoint (262.98s) --- PASS: TestAccS3ControlMultiRegionAccessPointPolicy_details_name (526.15s) --- PASS: TestAccS3ControlMultiRegionAccessPointPolicy_basic (286.04s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/s3control 1215.420s
1 parent 9c13138 commit 723aae3

12 files changed

+232
-265
lines changed

internal/provider/provider.go

-4
Original file line numberDiff line numberDiff line change
@@ -870,8 +870,6 @@ func New(ctx context.Context) (*schema.Provider, error) {
870870
"aws_s3_bucket_objects": s3.DataSourceBucketObjects(), // DEPRECATED: use aws_s3_objects instead
871871
"aws_s3_bucket_policy": s3.DataSourceBucketPolicy(),
872872

873-
"aws_s3control_multi_region_access_point": s3control.DataSourceMultiRegionAccessPoint(),
874-
875873
"aws_sagemaker_prebuilt_ecr_image": sagemaker.DataSourcePrebuiltECRImage(),
876874

877875
"aws_secretsmanager_random_password": secretsmanager.DataSourceRandomPassword(),
@@ -2005,8 +2003,6 @@ func New(ctx context.Context) (*schema.Provider, error) {
20052003
"aws_s3_object_copy": s3.ResourceObjectCopy(),
20062004
"aws_s3_bucket_object": s3.ResourceBucketObject(), // DEPRECATED: use aws_s3_object instead
20072005

2008-
"aws_s3control_multi_region_access_point": s3control.ResourceMultiRegionAccessPoint(),
2009-
"aws_s3control_multi_region_access_point_policy": s3control.ResourceMultiRegionAccessPointPolicy(),
20102006
"aws_s3control_object_lambda_access_point": s3control.ResourceObjectLambdaAccessPoint(),
20112007
"aws_s3control_object_lambda_access_point_policy": s3control.ResourceObjectLambdaAccessPointPolicy(),
20122008

internal/service/s3control/exports_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ var (
88
ResourceBucket = resourceBucket
99
ResourceBucketLifecycleConfiguration = resourceBucketLifecycleConfiguration
1010
ResourceBucketPolicy = resourceBucketPolicy
11+
ResourceMultiRegionAccessPoint = resourceMultiRegionAccessPoint
12+
ResourceMultiRegionAccessPointPolicy = resourceMultiRegionAccessPointPolicy
1113
ResourceStorageLensConfiguration = resourceStorageLensConfiguration
1214
)

internal/service/s3control/find.go

-78
Original file line numberDiff line numberDiff line change
@@ -8,84 +8,6 @@ import (
88
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
99
)
1010

11-
func FindMultiRegionAccessPointByAccountIDAndName(conn *s3control.S3Control, accountID string, name string) (*s3control.MultiRegionAccessPointReport, error) {
12-
input := &s3control.GetMultiRegionAccessPointInput{
13-
AccountId: aws.String(accountID),
14-
Name: aws.String(name),
15-
}
16-
17-
output, err := conn.GetMultiRegionAccessPoint(input)
18-
19-
if tfawserr.ErrCodeEquals(err, errCodeNoSuchMultiRegionAccessPoint) {
20-
return nil, &resource.NotFoundError{
21-
LastError: err,
22-
LastRequest: input,
23-
}
24-
}
25-
26-
if err != nil {
27-
return nil, err
28-
}
29-
30-
if output == nil || output.AccessPoint == nil {
31-
return nil, tfresource.NewEmptyResultError(input)
32-
}
33-
34-
return output.AccessPoint, nil
35-
}
36-
37-
func findMultiRegionAccessPointOperationByAccountIDAndTokenARN(conn *s3control.S3Control, accountID string, requestTokenARN string) (*s3control.AsyncOperation, error) {
38-
input := &s3control.DescribeMultiRegionAccessPointOperationInput{
39-
AccountId: aws.String(accountID),
40-
RequestTokenARN: aws.String(requestTokenARN),
41-
}
42-
43-
output, err := conn.DescribeMultiRegionAccessPointOperation(input)
44-
45-
if tfawserr.ErrCodeEquals(err, errCodeNoSuchAsyncRequest) {
46-
return nil, &resource.NotFoundError{
47-
LastError: err,
48-
LastRequest: input,
49-
}
50-
}
51-
52-
if err != nil {
53-
return nil, err
54-
}
55-
56-
if output == nil || output.AsyncOperation == nil {
57-
return nil, tfresource.NewEmptyResultError(input)
58-
}
59-
60-
return output.AsyncOperation, nil
61-
}
62-
63-
func FindMultiRegionAccessPointPolicyDocumentByAccountIDAndName(conn *s3control.S3Control, accountID string, name string) (*s3control.MultiRegionAccessPointPolicyDocument, error) {
64-
input := &s3control.GetMultiRegionAccessPointPolicyInput{
65-
AccountId: aws.String(accountID),
66-
Name: aws.String(name),
67-
}
68-
69-
output, err := conn.GetMultiRegionAccessPointPolicy(input)
70-
71-
if tfawserr.ErrCodeEquals(err, errCodeNoSuchMultiRegionAccessPoint) {
72-
return nil, &resource.NotFoundError{
73-
LastError: err,
74-
LastRequest: input,
75-
}
76-
}
77-
78-
if err != nil {
79-
return nil, err
80-
}
81-
82-
if output == nil || output.Policy == nil {
83-
return nil, tfresource.NewEmptyResultError(input)
84-
}
85-
86-
return output.Policy, nil
87-
}
88-
8911
func FindObjectLambdaAccessPointByAccountIDAndName(conn *s3control.S3Control, accountID string, name string) (*s3control.ObjectLambdaConfiguration, error) {
9012
input := &s3control.GetAccessPointConfigurationForObjectLambdaInput{
9113
AccountId: aws.String(accountID),

internal/service/s3control/multi_region_access_point.go

+137-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package s3control
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"strings"
@@ -11,18 +12,24 @@ import (
1112
"github.com/aws/aws-sdk-go/aws/endpoints"
1213
"github.com/aws/aws-sdk-go/service/s3control"
1314
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
16+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1417
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1518
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1619
"github.com/hashicorp/terraform-provider-aws/internal/conns"
1720
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
1821
"github.com/hashicorp/terraform-provider-aws/internal/verify"
1922
)
2023

21-
func ResourceMultiRegionAccessPoint() *schema.Resource {
24+
func init() {
25+
_sp.registerSDKResourceFactory("aws_s3control_multi_region_access_point", resourceMultiRegionAccessPoint)
26+
}
27+
28+
func resourceMultiRegionAccessPoint() *schema.Resource {
2229
return &schema.Resource{
23-
Create: resourceMultiRegionAccessPointCreate,
24-
Read: resourceMultiRegionAccessPointRead,
25-
Delete: resourceMultiRegionAccessPointDelete,
30+
CreateWithoutTimeout: resourceMultiRegionAccessPointCreate,
31+
ReadWithoutTimeout: resourceMultiRegionAccessPointRead,
32+
DeleteWithoutTimeout: resourceMultiRegionAccessPointDelete,
2633

2734
Importer: &schema.ResourceImporter{
2835
State: schema.ImportStatePassthrough,
@@ -131,11 +138,11 @@ func ResourceMultiRegionAccessPoint() *schema.Resource {
131138
}
132139
}
133140

134-
func resourceMultiRegionAccessPointCreate(d *schema.ResourceData, meta interface{}) error {
141+
func resourceMultiRegionAccessPointCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
135142
conn, err := ConnForMRAP(meta.(*conns.AWSClient))
136143

137144
if err != nil {
138-
return err
145+
return diag.FromErr(err)
139146
}
140147

141148
accountID := meta.(*conns.AWSClient).AccountID
@@ -153,38 +160,37 @@ func resourceMultiRegionAccessPointCreate(d *schema.ResourceData, meta interface
153160

154161
resourceID := MultiRegionAccessPointCreateResourceID(accountID, aws.StringValue(input.Details.Name))
155162

156-
log.Printf("[DEBUG] Creating S3 Multi-Region Access Point: %s", input)
157-
output, err := conn.CreateMultiRegionAccessPoint(input)
163+
output, err := conn.CreateMultiRegionAccessPointWithContext(ctx, input)
158164

159165
if err != nil {
160-
return fmt.Errorf("error creating S3 Multi-Region Access Point (%s): %w", resourceID, err)
166+
return diag.Errorf("creating S3 Multi-Region Access Point (%s): %s", resourceID, err)
161167
}
162168

163169
d.SetId(resourceID)
164170

165-
_, err = waitMultiRegionAccessPointRequestSucceeded(conn, accountID, aws.StringValue(output.RequestTokenARN), d.Timeout(schema.TimeoutCreate))
171+
_, err = waitMultiRegionAccessPointRequestSucceeded(ctx, conn, accountID, aws.StringValue(output.RequestTokenARN), d.Timeout(schema.TimeoutCreate))
166172

167173
if err != nil {
168-
return fmt.Errorf("error waiting for Multi-Region Access Point (%s) create: %s", d.Id(), err)
174+
return diag.Errorf("waiting for Multi-Region Access Point (%s) create: %s", d.Id(), err)
169175
}
170176

171-
return resourceMultiRegionAccessPointRead(d, meta)
177+
return resourceMultiRegionAccessPointRead(ctx, d, meta)
172178
}
173179

174-
func resourceMultiRegionAccessPointRead(d *schema.ResourceData, meta interface{}) error {
180+
func resourceMultiRegionAccessPointRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
175181
conn, err := ConnForMRAP(meta.(*conns.AWSClient))
176182

177183
if err != nil {
178-
return err
184+
return diag.FromErr(err)
179185
}
180186

181187
accountID, name, err := MultiRegionAccessPointParseResourceID(d.Id())
182188

183189
if err != nil {
184-
return err
190+
return diag.FromErr(err)
185191
}
186192

187-
accessPoint, err := FindMultiRegionAccessPointByAccountIDAndName(conn, accountID, name)
193+
accessPoint, err := FindMultiRegionAccessPointByTwoPartKey(ctx, conn, accountID, name)
188194

189195
if !d.IsNewResource() && tfresource.NotFound(err) {
190196
log.Printf("[WARN] S3 Multi-Region Access Point (%s) not found, removing from state", d.Id())
@@ -193,7 +199,7 @@ func resourceMultiRegionAccessPointRead(d *schema.ResourceData, meta interface{}
193199
}
194200

195201
if err != nil {
196-
return fmt.Errorf("error reading S3 Multi-Region Access Point (%s): %w", d.Id(), err)
202+
return diag.Errorf("reading S3 Multi-Region Access Point (%s): %s", d.Id(), err)
197203
}
198204

199205
alias := aws.StringValue(accessPoint.Alias)
@@ -207,7 +213,7 @@ func resourceMultiRegionAccessPointRead(d *schema.ResourceData, meta interface{}
207213
d.Set("alias", alias)
208214
d.Set("arn", arn)
209215
if err := d.Set("details", []interface{}{flattenMultiRegionAccessPointReport(accessPoint)}); err != nil {
210-
return fmt.Errorf("error setting details: %w", err)
216+
return diag.Errorf("setting details: %s", err)
211217
}
212218
// https://docs.aws.amazon.com/AmazonS3/latest/userguide//MultiRegionAccessPointRequests.html#MultiRegionAccessPointHostnames.
213219
d.Set("domain_name", meta.(*conns.AWSClient).PartitionHostname(fmt.Sprintf("%s.accesspoint.s3-global", alias)))
@@ -216,21 +222,21 @@ func resourceMultiRegionAccessPointRead(d *schema.ResourceData, meta interface{}
216222
return nil
217223
}
218224

219-
func resourceMultiRegionAccessPointDelete(d *schema.ResourceData, meta interface{}) error {
225+
func resourceMultiRegionAccessPointDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
220226
conn, err := ConnForMRAP(meta.(*conns.AWSClient))
221227

222228
if err != nil {
223-
return err
229+
return diag.FromErr(err)
224230
}
225231

226232
accountID, name, err := MultiRegionAccessPointParseResourceID(d.Id())
227233

228234
if err != nil {
229-
return err
235+
return diag.FromErr(err)
230236
}
231237

232238
log.Printf("[DEBUG] Deleting S3 Multi-Region Access Point: %s", d.Id())
233-
output, err := conn.DeleteMultiRegionAccessPoint(&s3control.DeleteMultiRegionAccessPointInput{
239+
output, err := conn.DeleteMultiRegionAccessPointWithContext(ctx, &s3control.DeleteMultiRegionAccessPointInput{
234240
AccountId: aws.String(accountID),
235241
Details: &s3control.DeleteMultiRegionAccessPointInput_{
236242
Name: aws.String(name),
@@ -242,13 +248,13 @@ func resourceMultiRegionAccessPointDelete(d *schema.ResourceData, meta interface
242248
}
243249

244250
if err != nil {
245-
return fmt.Errorf("error deleting S3 Multi-Region Access Point (%s): %w", d.Id(), err)
251+
return diag.Errorf("deleting S3 Multi-Region Access Point (%s): %s", d.Id(), err)
246252
}
247253

248-
_, err = waitMultiRegionAccessPointRequestSucceeded(conn, accountID, aws.StringValue(output.RequestTokenARN), d.Timeout(schema.TimeoutDelete))
254+
_, err = waitMultiRegionAccessPointRequestSucceeded(ctx, conn, accountID, aws.StringValue(output.RequestTokenARN), d.Timeout(schema.TimeoutDelete))
249255

250256
if err != nil {
251-
return fmt.Errorf("error waiting for S3 Multi-Region Access Point (%s) delete: %w", d.Id(), err)
257+
return diag.Errorf("error waiting for S3 Multi-Region Access Point (%s) delete: %s", d.Id(), err)
252258
}
253259

254260
return nil
@@ -266,12 +272,117 @@ func ConnForMRAP(client *conns.AWSClient) (*s3control.S3Control, error) {
266272
sess, err := conns.NewSessionForRegion(&originalConn.Config, region, client.TerraformVersion)
267273

268274
if err != nil {
269-
return nil, fmt.Errorf("error creating AWS session: %w", err)
275+
return nil, fmt.Errorf("creating AWS session: %w", err)
270276
}
271277

272278
return s3control.New(sess), nil
273279
}
274280

281+
func FindMultiRegionAccessPointByTwoPartKey(ctx context.Context, conn *s3control.S3Control, accountID string, name string) (*s3control.MultiRegionAccessPointReport, error) {
282+
input := &s3control.GetMultiRegionAccessPointInput{
283+
AccountId: aws.String(accountID),
284+
Name: aws.String(name),
285+
}
286+
287+
output, err := conn.GetMultiRegionAccessPointWithContext(ctx, input)
288+
289+
if tfawserr.ErrCodeEquals(err, errCodeNoSuchMultiRegionAccessPoint) {
290+
return nil, &resource.NotFoundError{
291+
LastError: err,
292+
LastRequest: input,
293+
}
294+
}
295+
296+
if err != nil {
297+
return nil, err
298+
}
299+
300+
if output == nil || output.AccessPoint == nil {
301+
return nil, tfresource.NewEmptyResultError(input)
302+
}
303+
304+
return output.AccessPoint, nil
305+
}
306+
307+
func findMultiRegionAccessPointOperationByAccountIDAndTokenARN(ctx context.Context, conn *s3control.S3Control, accountID string, requestTokenARN string) (*s3control.AsyncOperation, error) {
308+
input := &s3control.DescribeMultiRegionAccessPointOperationInput{
309+
AccountId: aws.String(accountID),
310+
RequestTokenARN: aws.String(requestTokenARN),
311+
}
312+
313+
output, err := conn.DescribeMultiRegionAccessPointOperationWithContext(ctx, input)
314+
315+
if tfawserr.ErrCodeEquals(err, errCodeNoSuchAsyncRequest) {
316+
return nil, &resource.NotFoundError{
317+
LastError: err,
318+
LastRequest: input,
319+
}
320+
}
321+
322+
if err != nil {
323+
return nil, err
324+
}
325+
326+
if output == nil || output.AsyncOperation == nil {
327+
return nil, tfresource.NewEmptyResultError(input)
328+
}
329+
330+
return output.AsyncOperation, nil
331+
}
332+
333+
func statusMultiRegionAccessPointRequest(ctx context.Context, conn *s3control.S3Control, accountID string, requestTokenARN string) resource.StateRefreshFunc {
334+
return func() (interface{}, string, error) {
335+
output, err := findMultiRegionAccessPointOperationByAccountIDAndTokenARN(ctx, conn, accountID, requestTokenARN)
336+
337+
if tfresource.NotFound(err) {
338+
return nil, "", nil
339+
}
340+
341+
if err != nil {
342+
return nil, "", err
343+
}
344+
345+
return output, aws.StringValue(output.RequestStatus), nil
346+
}
347+
}
348+
349+
const (
350+
// Minimum amount of times to verify change propagation
351+
propagationContinuousTargetOccurence = 2
352+
353+
// Minimum amount of time to wait between S3control change polls
354+
propagationMinTimeout = 5 * time.Second
355+
356+
// Maximum amount of time to wait for S3control changes to propagate
357+
propagationTimeout = 1 * time.Minute
358+
359+
multiRegionAccessPointRequestSucceededMinTimeout = 5 * time.Second
360+
361+
multiRegionAccessPointRequestSucceededDelay = 15 * time.Second
362+
)
363+
364+
func waitMultiRegionAccessPointRequestSucceeded(ctx context.Context, conn *s3control.S3Control, accountID string, requestTokenArn string, timeout time.Duration) (*s3control.AsyncOperation, error) { //nolint:unparam
365+
stateConf := &resource.StateChangeConf{
366+
Target: []string{RequestStatusSucceeded},
367+
Timeout: timeout,
368+
Refresh: statusMultiRegionAccessPointRequest(ctx, conn, accountID, requestTokenArn),
369+
MinTimeout: multiRegionAccessPointRequestSucceededMinTimeout,
370+
Delay: multiRegionAccessPointRequestSucceededDelay,
371+
}
372+
373+
outputRaw, err := stateConf.WaitForStateContext(ctx)
374+
375+
if output, ok := outputRaw.(*s3control.AsyncOperation); ok {
376+
if status, responseDetails := aws.StringValue(output.RequestStatus), output.ResponseDetails; status == RequestStatusFailed && responseDetails != nil && responseDetails.ErrorDetails != nil {
377+
tfresource.SetLastError(err, fmt.Errorf("%s: %s", aws.StringValue(responseDetails.ErrorDetails.Code), aws.StringValue(responseDetails.ErrorDetails.Message)))
378+
}
379+
380+
return output, err
381+
}
382+
383+
return nil, err
384+
}
385+
275386
const multiRegionAccessPointResourceIDSeparator = ":"
276387

277388
func MultiRegionAccessPointCreateResourceID(accountID, accessPointName string) string {

0 commit comments

Comments
 (0)