Skip to content

Commit

Permalink
Merge pull request #40944 from romsrb/f-aws_s3_directory_bucket_encha…
Browse files Browse the repository at this point in the history
…ncements

Allow AWS Local Zones (LocalZone) as locationType F_aws_s3 directory_bucket_enchancements
  • Loading branch information
ewbankkit authored Feb 27, 2025
2 parents 6995a54 + ad809ae commit affb06d
Show file tree
Hide file tree
Showing 32 changed files with 248 additions and 85 deletions.
3 changes: 3 additions & 0 deletions .changelog/40944.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/aws_s3_directory_bucket: The default value for `data_redundancy` is `SingleLocalZone` if `location.type` is `LocalZone`
```
22 changes: 13 additions & 9 deletions internal/service/s3/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,7 @@ func resourceBucketCreate(ctx context.Context, d *schema.ResourceData, meta inte
// Special case: us-east-1 does not return error if the bucket already exists and is owned by
// current account. It also resets the Bucket ACLs.
if region == endpoints.UsEast1RegionID {
if err := findBucket(ctx, conn, bucket); err == nil {
if _, err := findBucket(ctx, conn, bucket); err == nil {
return sdkdiag.AppendErrorf(diags, "creating S3 Bucket (%s): %s", bucket, errors.New(errCodeBucketAlreadyExists))
}
}
Expand Down Expand Up @@ -766,7 +766,7 @@ func resourceBucketCreate(ctx context.Context, d *schema.ResourceData, meta inte
d.SetId(bucket)

_, err = tfresource.RetryWhenNotFound(ctx, d.Timeout(schema.TimeoutCreate), func() (interface{}, error) {
return nil, findBucket(ctx, conn, d.Id())
return findBucket(ctx, conn, d.Id())
})

if err != nil {
Expand All @@ -784,7 +784,7 @@ func resourceBucketRead(ctx context.Context, d *schema.ResourceData, meta interf
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).S3Client(ctx)

err := findBucket(ctx, conn, d.Id())
_, err := findBucket(ctx, conn, d.Id())

if !d.IsNewResource() && tfresource.NotFound(err) {
log.Printf("[WARN] S3 Bucket (%s) not found, removing from state", d.Id())
Expand Down Expand Up @@ -1586,7 +1586,7 @@ func resourceBucketDelete(ctx context.Context, d *schema.ResourceData, meta inte
}

_, err = tfresource.RetryUntilNotFound(ctx, d.Timeout(schema.TimeoutDelete), func() (interface{}, error) {
return nil, findBucket(ctx, conn, d.Id())
return findBucket(ctx, conn, d.Id())
})

if err != nil {
Expand All @@ -1596,23 +1596,27 @@ func resourceBucketDelete(ctx context.Context, d *schema.ResourceData, meta inte
return diags
}

func findBucket(ctx context.Context, conn *s3.Client, bucket string, optFns ...func(*s3.Options)) error {
input := &s3.HeadBucketInput{
func findBucket(ctx context.Context, conn *s3.Client, bucket string, optFns ...func(*s3.Options)) (*s3.HeadBucketOutput, error) {
input := s3.HeadBucketInput{
Bucket: aws.String(bucket),
}

_, err := conn.HeadBucket(ctx, input, optFns...)
output, err := conn.HeadBucket(ctx, &input, optFns...)

// For directory buckets that no longer exist it's the CreateSession call invoked by HeadBucket that returns "NoSuchBucket",
// and that error code is flattend into HeadBucket's error message -- hence the 'errs.Contains' call.
if tfawserr.ErrHTTPStatusCodeEquals(err, http.StatusNotFound) || tfawserr.ErrCodeEquals(err, errCodeNoSuchBucket) || errs.Contains(err, errCodeNoSuchBucket) {
return &retry.NotFoundError{
return nil, &retry.NotFoundError{
LastError: err,
LastRequest: input,
}
}

return err
if output == nil {
return nil, tfresource.NewEmptyResultError(input)
}

return output, nil
}

func findBucketRegion(ctx context.Context, awsClient *conns.AWSClient, bucket string, optFns ...func(*s3.Options)) (string, error) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ resource "aws_s3_bucket_accelerate_configuration" "test" {
}

func testAccBucketAccelerateConfigurationConfig_directoryBucket(bucketName, status string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(bucketName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(bucketName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_acl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,7 @@ resource "aws_s3_bucket_acl" "test" {
}

func testAccBucketACLConfig_directoryBucket(rName, acl string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_analytics_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,7 @@ resource "aws_s3_bucket" "destination" {
}

func testAccBucketAnalyticsConfigurationConfig_directoryBucket(bucket, name string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(bucket), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(bucket), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_cors_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,7 @@ resource "aws_s3_bucket_cors_configuration" "test" {
}

func testAccBucketCORSConfigurationConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), `
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), `
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func dataSourceBucketRead(ctx context.Context, d *schema.ResourceData, meta inte
optFns = append(optFns, func(o *s3.Options) { o.UseARNRegion = true })
}

err := findBucket(ctx, conn, bucket, optFns...)
_, err := findBucket(ctx, conn, bucket, optFns...)

if err != nil {
return sdkdiag.AppendErrorf(diags, "reading S3 Bucket (%s): %s", bucket, err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ resource "aws_s3_bucket" "test" {
}

func testAccBucketIntelligentTieringConfigurationConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_inventory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ resource "aws_s3_bucket_inventory" "test" {
}

func testAccBucketInventoryConfig_directoryBucket(bucketName, inventoryName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(bucketName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(bucketName), fmt.Sprintf(`
data "aws_caller_identity" "current" {}
resource "aws_s3_directory_bucket" "test" {
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_lifecycle_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2869,7 +2869,7 @@ resource "aws_s3_bucket_lifecycle_configuration" "test" {
}

func testAccBucketLifecycleConfigurationConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_logging_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,7 @@ resource "aws_s3_bucket_logging" "test" {
}

func testAccBucketLoggingConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccBucketLoggingConfig_base(rName), testAccDirectoryBucketConfig_base(rName), `
return acctest.ConfigCompose(testAccBucketLoggingConfig_base(rName), testAccDirectoryBucketConfig_baseAZ(rName), `
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
location {
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_metric_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,7 @@ resource "aws_s3_bucket_metric" "test" {
}

func testAccBucketMetricConfig_directoryBucket(bucketName, metricName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(bucketName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(bucketName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_notification_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ resource "aws_s3_bucket_notification" "test" {
}

func testAccBucketNotificationConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), `
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), `
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ resource "aws_s3_bucket_object_lock_configuration" "test" {
}

func testAccBucketObjectLockConfigurationConfig_directoryBucket(bucketName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(bucketName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(bucketName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_ownership_controls_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ resource "aws_s3_bucket_ownership_controls" "test" {
}

func testAccBucketOwnershipControlsConfig_directoryBucket(rName, objectOwnership string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -944,7 +944,7 @@ resource "aws_s3_bucket_policy" "test" {
}

func testAccBucketPolicyConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), `
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), `
data "aws_partition" "current" {}
data "aws_caller_identity" "current" {}
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_public_access_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ resource "aws_s3_bucket_public_access_block" "test" {
}

func testAccBucketPublicAccessBlockConfig_directoryBucket(bucketName, blockPublicAcls, blockPublicPolicy, ignorePublicAcls, restrictPublicBuckets string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(bucketName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(bucketName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
location {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2441,7 +2441,7 @@ resource "aws_s3_bucket_replication_configuration" "test" {
}

func testAccBucketReplicationConfigurationConfig_directoryBucket(rName, storageClass string) string {
return acctest.ConfigCompose(testAccBucketReplicationConfigurationConfig_base(rName), testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccBucketReplicationConfigurationConfig_base(rName), testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
location {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ resource "aws_s3_bucket_request_payment_configuration" "test" {
}

func testAccBucketRequestPaymentConfigurationConfig_directoryBucket(rName, payer string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@ resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
}

func testAccBucketServerSideEncryptionConfigurationConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
6 changes: 4 additions & 2 deletions internal/service/s3/bucket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2505,7 +2505,7 @@ func testAccCheckBucketDestroyWithProvider(ctx context.Context) acctest.TestChec
// S3 seems to be highly eventually consistent. Even if one connection reports that the queue is gone,
// another connection may still report it as present.
_, err := tfresource.RetryUntilNotFound(ctx, tfs3.BucketPropagationTimeout, func() (interface{}, error) {
return nil, tfs3.FindBucket(ctx, conn, rs.Primary.ID)
return tfs3.FindBucket(ctx, conn, rs.Primary.ID)
})

if errors.Is(err, tfresource.ErrFoundResource) {
Expand Down Expand Up @@ -2536,7 +2536,9 @@ func testAccCheckBucketExistsWithProvider(ctx context.Context, n string, provide

conn := providerF().Meta().(*conns.AWSClient).S3Client(ctx)

return tfs3.FindBucket(ctx, conn, rs.Primary.ID)
_, err := tfs3.FindBucket(ctx, conn, rs.Primary.ID)

return err
}
}

Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_versioning_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,7 @@ resource "aws_s3_bucket_versioning" "test" {
}

func testAccBucketVersioningConfig_directoryBucket(rName, status string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), fmt.Sprintf(`
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
2 changes: 1 addition & 1 deletion internal/service/s3/bucket_website_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -941,7 +941,7 @@ resource "aws_s3_bucket_website_configuration" "test" {
}

func testAccBucketWebsiteConfigurationConfig_directoryBucket(rName string) string {
return acctest.ConfigCompose(testAccDirectoryBucketConfig_base(rName), `
return acctest.ConfigCompose(testAccDirectoryBucketConfig_baseAZ(rName), `
resource "aws_s3_directory_bucket" "test" {
bucket = local.bucket
Expand Down
Loading

0 comments on commit affb06d

Please sign in to comment.