Skip to content

Commit 6f101c4

Browse files
committed
r/aws_s3_account_public_access_block & d/aws_s3_account_public_access_block: Switch to 'WithoutTimeout' CRUD handlers (#15090).
Acceptance test output: % make testacc TESTARGS='-run=TestAccS3ControlAccountPublicAccessBlock_serial' 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=TestAccS3ControlAccountPublicAccessBlock_serial -timeout 180m === RUN TestAccS3ControlAccountPublicAccessBlock_serial === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/IgnorePublicAcls === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/RestrictPublicBuckets === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/DataSourceBasic === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/basic === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/disappears === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/AccountId === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/BlockPublicAcls === RUN TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/BlockPublicPolicy --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial (281.95s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock (281.95s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/IgnorePublicAcls (53.59s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/RestrictPublicBuckets (51.64s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/DataSourceBasic (17.86s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/basic (20.37s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/disappears (16.18s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/AccountId (20.41s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/BlockPublicAcls (51.20s) --- PASS: TestAccS3ControlAccountPublicAccessBlock_serial/PublicAccessBlock/BlockPublicPolicy (50.69s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/s3control 286.966s
1 parent 96e76b3 commit 6f101c4

10 files changed

+169
-377
lines changed

internal/provider/provider.go

-2
Original file line numberDiff line numberDiff line change
@@ -870,7 +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_s3_account_public_access_block": s3control.DataSourceAccountPublicAccessBlock(),
874873
"aws_s3control_multi_region_access_point": s3control.DataSourceMultiRegionAccessPoint(),
875874

876875
"aws_sagemaker_prebuilt_ecr_image": sagemaker.DataSourcePrebuiltECRImage(),
@@ -2006,7 +2005,6 @@ func New(ctx context.Context) (*schema.Provider, error) {
20062005
"aws_s3_object_copy": s3.ResourceObjectCopy(),
20072006
"aws_s3_bucket_object": s3.ResourceBucketObject(), // DEPRECATED: use aws_s3_object instead
20082007

2009-
"aws_s3_account_public_access_block": s3control.ResourceAccountPublicAccessBlock(),
20102008
"aws_s3control_bucket": s3control.ResourceBucket(),
20112009
"aws_s3control_bucket_lifecycle_configuration": s3control.ResourceBucketLifecycleConfiguration(),
20122010
"aws_s3control_bucket_policy": s3control.ResourceBucketPolicy(),

internal/service/s3control/access_point_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ func testAccCheckAccessPointDestroy(s *terraform.State) error {
326326

327327
return fmt.Errorf("S3 Access Point %s still exists", rs.Primary.ID)
328328
}
329+
329330
return nil
330331
}
331332

Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
package s3control
22

33
import (
4-
"fmt"
4+
"context"
55
"log"
6+
"reflect"
7+
"strconv"
68

79
"github.com/aws/aws-sdk-go/aws"
810
"github.com/aws/aws-sdk-go/service/s3control"
911
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1013
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1114
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1215
"github.com/hashicorp/terraform-provider-aws/internal/conns"
1316
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
1417
"github.com/hashicorp/terraform-provider-aws/internal/verify"
1518
)
1619

17-
func ResourceAccountPublicAccessBlock() *schema.Resource {
20+
func init() {
21+
_sp.registerSDKResourceFactory("aws_s3_account_public_access_block", resourceAccountPublicAccessBlock)
22+
}
23+
24+
func resourceAccountPublicAccessBlock() *schema.Resource {
1825
return &schema.Resource{
19-
Create: resourceAccountPublicAccessBlockCreate,
20-
Read: resourceAccountPublicAccessBlockRead,
21-
Update: resourceAccountPublicAccessBlockUpdate,
22-
Delete: resourceAccountPublicAccessBlockDelete,
26+
CreateWithoutTimeout: resourceAccountPublicAccessBlockCreate,
27+
ReadWithoutTimeout: resourceAccountPublicAccessBlockRead,
28+
UpdateWithoutTimeout: resourceAccountPublicAccessBlockUpdate,
29+
DeleteWithoutTimeout: resourceAccountPublicAccessBlockDelete,
30+
2331
Importer: &schema.ResourceImporter{
2432
State: schema.ImportStatePassthrough,
2533
},
@@ -56,7 +64,7 @@ func ResourceAccountPublicAccessBlock() *schema.Resource {
5664
}
5765
}
5866

59-
func resourceAccountPublicAccessBlockCreate(d *schema.ResourceData, meta interface{}) error {
67+
func resourceAccountPublicAccessBlockCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
6068
conn := meta.(*conns.AWSClient).S3ControlConn()
6169

6270
accountID := meta.(*conns.AWSClient).AccountID
@@ -74,130 +82,151 @@ func resourceAccountPublicAccessBlockCreate(d *schema.ResourceData, meta interfa
7482
},
7583
}
7684

77-
log.Printf("[DEBUG] Creating S3 Account Public Access Block: %s", input)
78-
_, err := conn.PutPublicAccessBlock(input)
85+
_, err := conn.PutPublicAccessBlockWithContext(ctx, input)
86+
7987
if err != nil {
80-
return fmt.Errorf("error creating S3 Account Public Access Block: %s", err)
88+
return diag.Errorf("creating S3 Account Public Access Block (%s): %s", accountID, err)
8189
}
8290

8391
d.SetId(accountID)
8492

85-
return resourceAccountPublicAccessBlockRead(d, meta)
86-
}
87-
88-
func resourceAccountPublicAccessBlockRead(d *schema.ResourceData, meta interface{}) error {
89-
conn := meta.(*conns.AWSClient).S3ControlConn()
93+
_, err = tfresource.RetryWhenNotFoundContext(ctx, propagationTimeout, func() (interface{}, error) {
94+
return FindPublicAccessBlockByAccountID(ctx, conn, d.Id())
95+
})
9096

91-
input := &s3control.GetPublicAccessBlockInput{
92-
AccountId: aws.String(d.Id()),
97+
if err != nil {
98+
return diag.Errorf("waiting for S3 Account Public Access Block (%s) create: %s", d.Id(), err)
9399
}
94100

95-
// Retry for eventual consistency on creation
96-
var output *s3control.GetPublicAccessBlockOutput
97-
err := resource.Retry(propagationTimeout, func() *resource.RetryError {
98-
var err error
99-
output, err = conn.GetPublicAccessBlock(input)
100-
101-
if d.IsNewResource() && tfawserr.ErrCodeEquals(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration) {
102-
return resource.RetryableError(err)
103-
}
104-
105-
if err != nil {
106-
return resource.NonRetryableError(err)
107-
}
101+
return resourceAccountPublicAccessBlockRead(ctx, d, meta)
102+
}
108103

109-
return nil
110-
})
104+
func resourceAccountPublicAccessBlockRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
105+
conn := meta.(*conns.AWSClient).S3ControlConn()
111106

112-
if tfresource.TimedOut(err) {
113-
output, err = conn.GetPublicAccessBlock(input)
114-
}
107+
output, err := FindPublicAccessBlockByAccountID(ctx, conn, d.Id())
115108

116-
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration) {
109+
if !d.IsNewResource() && tfresource.NotFound(err) {
117110
log.Printf("[WARN] S3 Account Public Access Block (%s) not found, removing from state", d.Id())
118111
d.SetId("")
119112
return nil
120113
}
121114

122115
if err != nil {
123-
return fmt.Errorf("error reading S3 Account Public Access Block: %s", err)
124-
}
125-
126-
if output == nil || output.PublicAccessBlockConfiguration == nil {
127-
return fmt.Errorf("error reading S3 Account Public Access Block (%s): missing public access block configuration", d.Id())
116+
return diag.Errorf("reading S3 Account Public Access Block (%s): %s", d.Id(), err)
128117
}
129118

130119
d.Set("account_id", d.Id())
131-
d.Set("block_public_acls", output.PublicAccessBlockConfiguration.BlockPublicAcls)
132-
d.Set("block_public_policy", output.PublicAccessBlockConfiguration.BlockPublicPolicy)
133-
d.Set("ignore_public_acls", output.PublicAccessBlockConfiguration.IgnorePublicAcls)
134-
d.Set("restrict_public_buckets", output.PublicAccessBlockConfiguration.RestrictPublicBuckets)
120+
d.Set("block_public_acls", output.BlockPublicAcls)
121+
d.Set("block_public_policy", output.BlockPublicPolicy)
122+
d.Set("ignore_public_acls", output.IgnorePublicAcls)
123+
d.Set("restrict_public_buckets", output.RestrictPublicBuckets)
135124

136125
return nil
137126
}
138127

139-
func resourceAccountPublicAccessBlockUpdate(d *schema.ResourceData, meta interface{}) error {
128+
func resourceAccountPublicAccessBlockUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
140129
conn := meta.(*conns.AWSClient).S3ControlConn()
141130

131+
publicAccessBlockConfiguration := &s3control.PublicAccessBlockConfiguration{
132+
BlockPublicAcls: aws.Bool(d.Get("block_public_acls").(bool)),
133+
BlockPublicPolicy: aws.Bool(d.Get("block_public_policy").(bool)),
134+
IgnorePublicAcls: aws.Bool(d.Get("ignore_public_acls").(bool)),
135+
RestrictPublicBuckets: aws.Bool(d.Get("restrict_public_buckets").(bool)),
136+
}
142137
input := &s3control.PutPublicAccessBlockInput{
138+
AccountId: aws.String(d.Id()),
139+
PublicAccessBlockConfiguration: publicAccessBlockConfiguration,
140+
}
141+
142+
_, err := conn.PutPublicAccessBlockWithContext(ctx, input)
143+
144+
if err != nil {
145+
return diag.Errorf("updating S3 Account Public Access Block (%s): %s", d.Id(), err)
146+
}
147+
148+
if _, err := waitPublicAccessBlockEqual(ctx, conn, d.Id(), publicAccessBlockConfiguration); err != nil {
149+
return diag.Errorf("waiting for S3 Account Public Access Block (%s) update: %s", d.Id(), err)
150+
}
151+
152+
return resourceAccountPublicAccessBlockRead(ctx, d, meta)
153+
}
154+
155+
func resourceAccountPublicAccessBlockDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
156+
conn := meta.(*conns.AWSClient).S3ControlConn()
157+
158+
log.Printf("[DEBUG] Deleting S3 Account Public Access Block: %s", d.Id())
159+
_, err := conn.DeletePublicAccessBlockWithContext(ctx, &s3control.DeletePublicAccessBlockInput{
143160
AccountId: aws.String(d.Id()),
144-
PublicAccessBlockConfiguration: &s3control.PublicAccessBlockConfiguration{
145-
BlockPublicAcls: aws.Bool(d.Get("block_public_acls").(bool)),
146-
BlockPublicPolicy: aws.Bool(d.Get("block_public_policy").(bool)),
147-
IgnorePublicAcls: aws.Bool(d.Get("ignore_public_acls").(bool)),
148-
RestrictPublicBuckets: aws.Bool(d.Get("restrict_public_buckets").(bool)),
149-
},
161+
})
162+
163+
if tfawserr.ErrCodeEquals(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration) {
164+
return nil
150165
}
151166

152-
log.Printf("[DEBUG] Updating S3 Account Public Access Block: %s", input)
153-
_, err := conn.PutPublicAccessBlock(input)
154167
if err != nil {
155-
return fmt.Errorf("error updating S3 Account Public Access Block (%s): %s", d.Id(), err)
168+
return diag.Errorf("deleting S3 Account Public Access Block (%s): %s", d.Id(), err)
156169
}
157170

158-
if d.HasChange("block_public_acls") {
159-
if _, err := waitPublicAccessBlockConfigurationBlockPublicACLsUpdated(conn, d.Id(), d.Get("block_public_acls").(bool)); err != nil {
160-
return fmt.Errorf("error waiting for S3 Account Public Access Block (%s) block_public_acls update: %w", d.Id(), err)
161-
}
171+
return nil
172+
}
173+
174+
func FindPublicAccessBlockByAccountID(ctx context.Context, conn *s3control.S3Control, accountID string) (*s3control.PublicAccessBlockConfiguration, error) {
175+
input := &s3control.GetPublicAccessBlockInput{
176+
AccountId: aws.String(accountID),
162177
}
163178

164-
if d.HasChange("block_public_policy") {
165-
if _, err := waitPublicAccessBlockConfigurationBlockPublicPolicyUpdated(conn, d.Id(), d.Get("block_public_policy").(bool)); err != nil {
166-
return fmt.Errorf("error waiting for S3 Account Public Access Block (%s) block_public_policy update: %w", d.Id(), err)
179+
output, err := conn.GetPublicAccessBlockWithContext(ctx, input)
180+
181+
if tfawserr.ErrCodeEquals(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration) {
182+
return nil, &resource.NotFoundError{
183+
LastError: err,
184+
LastRequest: input,
167185
}
168186
}
169187

170-
if d.HasChange("ignore_public_acls") {
171-
if _, err := waitPublicAccessBlockConfigurationIgnorePublicACLsUpdated(conn, d.Id(), d.Get("ignore_public_acls").(bool)); err != nil {
172-
return fmt.Errorf("error waiting for S3 Account Public Access Block (%s) ignore_public_acls update: %w", d.Id(), err)
173-
}
188+
if err != nil {
189+
return nil, err
174190
}
175191

176-
if d.HasChange("restrict_public_buckets") {
177-
if _, err := waitPublicAccessBlockConfigurationRestrictPublicBucketsUpdated(conn, d.Id(), d.Get("restrict_public_buckets").(bool)); err != nil {
178-
return fmt.Errorf("error waiting for S3 Account Public Access Block (%s) restrict_public_buckets update: %w", d.Id(), err)
179-
}
192+
if output == nil || output.PublicAccessBlockConfiguration == nil {
193+
return nil, tfresource.NewEmptyResultError(input)
180194
}
181195

182-
return resourceAccountPublicAccessBlockRead(d, meta)
196+
return output.PublicAccessBlockConfiguration, nil
183197
}
184198

185-
func resourceAccountPublicAccessBlockDelete(d *schema.ResourceData, meta interface{}) error {
186-
conn := meta.(*conns.AWSClient).S3ControlConn()
199+
func statusPublicAccessBlockEqual(ctx context.Context, conn *s3control.S3Control, accountID string, target *s3control.PublicAccessBlockConfiguration) resource.StateRefreshFunc {
200+
return func() (interface{}, string, error) {
201+
output, err := FindPublicAccessBlockByAccountID(ctx, conn, accountID)
187202

188-
input := &s3control.DeletePublicAccessBlockInput{
189-
AccountId: aws.String(d.Id()),
190-
}
203+
if tfresource.NotFound(err) {
204+
return nil, "", nil
205+
}
206+
207+
if err != nil {
208+
return nil, "", err
209+
}
191210

192-
_, err := conn.DeletePublicAccessBlock(input)
211+
return output, strconv.FormatBool(reflect.DeepEqual(output, target)), nil
212+
}
213+
}
193214

194-
if tfawserr.ErrCodeEquals(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration) {
195-
return nil
215+
func waitPublicAccessBlockEqual(ctx context.Context, conn *s3control.S3Control, accountID string, target *s3control.PublicAccessBlockConfiguration) (*s3control.PublicAccessBlockConfiguration, error) {
216+
stateConf := &resource.StateChangeConf{
217+
Pending: []string{strconv.FormatBool(false)},
218+
Target: []string{strconv.FormatBool(true)},
219+
Refresh: statusPublicAccessBlockEqual(ctx, conn, accountID, target),
220+
Timeout: propagationTimeout,
221+
MinTimeout: propagationMinTimeout,
222+
ContinuousTargetOccurence: propagationContinuousTargetOccurence,
196223
}
197224

198-
if err != nil {
199-
return fmt.Errorf("error deleting S3 Account Public Access Block (%s): %s", d.Id(), err)
225+
outputRaw, err := stateConf.WaitForStateContext(ctx)
226+
227+
if output, ok := outputRaw.(*s3control.PublicAccessBlockConfiguration); ok {
228+
return output, err
200229
}
201230

202-
return nil
231+
return nil, err
203232
}

internal/service/s3control/account_public_access_block_data_source.go

+11-20
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ package s3control
22

33
import (
44
"context"
5-
"log"
65

7-
"github.com/aws/aws-sdk-go/aws"
8-
"github.com/aws/aws-sdk-go/service/s3control"
96
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
107
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
118
"github.com/hashicorp/terraform-provider-aws/internal/conns"
129
"github.com/hashicorp/terraform-provider-aws/internal/verify"
1310
)
1411

15-
func DataSourceAccountPublicAccessBlock() *schema.Resource {
12+
func init() {
13+
_sp.registerSDKDataSourceFactory("aws_s3_account_public_access_block", dataSourceAccountPublicAccessBlock)
14+
}
15+
16+
func dataSourceAccountPublicAccessBlock() *schema.Resource {
1617
return &schema.Resource{
1718
ReadWithoutTimeout: dataSourceAccountPublicAccessBlockRead,
1819

@@ -50,27 +51,17 @@ func dataSourceAccountPublicAccessBlockRead(ctx context.Context, d *schema.Resou
5051
accountID = v.(string)
5152
}
5253

53-
input := &s3control.GetPublicAccessBlockInput{
54-
AccountId: aws.String(accountID),
55-
}
56-
57-
log.Printf("[DEBUG] Reading Account access block: %s", input)
58-
59-
output, err := conn.GetPublicAccessBlock(input)
54+
output, err := FindPublicAccessBlockByAccountID(ctx, conn, accountID)
6055

6156
if err != nil {
62-
return diag.Errorf("error reading S3 Account Public Access Block: %s", err)
63-
}
64-
65-
if output == nil || output.PublicAccessBlockConfiguration == nil {
66-
return diag.Errorf("error reading S3 Account Public Access Block (%s): missing public access block configuration", accountID)
57+
return diag.Errorf("reading S3 Account Public Access Block (%s): %s", accountID, err)
6758
}
6859

6960
d.SetId(accountID)
70-
d.Set("block_public_acls", output.PublicAccessBlockConfiguration.BlockPublicAcls)
71-
d.Set("block_public_policy", output.PublicAccessBlockConfiguration.BlockPublicPolicy)
72-
d.Set("ignore_public_acls", output.PublicAccessBlockConfiguration.IgnorePublicAcls)
73-
d.Set("restrict_public_buckets", output.PublicAccessBlockConfiguration.RestrictPublicBuckets)
61+
d.Set("block_public_acls", output.BlockPublicAcls)
62+
d.Set("block_public_policy", output.BlockPublicPolicy)
63+
d.Set("ignore_public_acls", output.IgnorePublicAcls)
64+
d.Set("restrict_public_buckets", output.RestrictPublicBuckets)
7465

7566
return nil
7667
}

internal/service/s3control/account_public_access_block_data_source_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import (
88
"github.com/hashicorp/terraform-provider-aws/internal/acctest"
99
)
1010

11-
func TestAccS3ControlAccountPublicAccessBlockDataSource_basic(t *testing.T) {
11+
func testAccAccountPublicAccessBlockDataSource_basic(t *testing.T) {
1212
resourceName := "aws_s3_account_public_access_block.test"
1313
dataSourceName := "data.aws_s3_account_public_access_block.test"
14-
resource.ParallelTest(t, resource.TestCase{
14+
15+
resource.Test(t, resource.TestCase{
1516
PreCheck: func() { acctest.PreCheck(t) },
1617
ErrorCheck: acctest.ErrorCheck(t, s3control.EndpointsID),
1718
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,

0 commit comments

Comments
 (0)