Skip to content

Commit

Permalink
Implement multi region access point data source
Browse files Browse the repository at this point in the history
- Implement the data source
- Implement the test for the data source
- Create draft documentation
  • Loading branch information
tiborhercz committed Dec 15, 2022
1 parent 2dbb620 commit a6e4aae
Show file tree
Hide file tree
Showing 4 changed files with 208 additions and 1 deletion.
3 changes: 2 additions & 1 deletion internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -843,7 +843,8 @@ func New(_ context.Context) (*schema.Provider, error) {
"aws_s3_bucket_objects": s3.DataSourceBucketObjects(), // DEPRECATED: use aws_s3_objects instead
"aws_s3_bucket_policy": s3.DataSourceBucketPolicy(),

"aws_s3_account_public_access_block": s3control.DataSourceAccountPublicAccessBlock(),
"aws_s3_account_public_access_block": s3control.DataSourceAccountPublicAccessBlock(),
"aws_s3control_multi_region_access_point": s3control.DataSourceMultiRegionAccessPoint(),

"aws_sagemaker_prebuilt_ecr_image": sagemaker.DataSourcePrebuiltECRImage(),

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package s3control

import (
"context"
"log"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3control"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
"github.com/hashicorp/terraform-provider-aws/internal/verify"
)

func DataSourceMultiRegionAccessPoint() *schema.Resource {
return &schema.Resource{
ReadWithoutTimeout: dataSourceMultiRegionAccessPointBlockRead,

Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: verify.ValidAccountID,
},
"name": {
Type: schema.TypeString,
Required: true,
},
"alias": {
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Type: schema.TypeString,
Computed: true,
},
"public_access_block": {
Type: schema.TypeMap,
Computed: true,
},
"regions": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeList,
},
},
"status": {
Type: schema.TypeString,
Computed: true,
},
},
}
}

func dataSourceMultiRegionAccessPointBlockRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).S3ControlConn

accountID := meta.(*conns.AWSClient).AccountID
if v, ok := d.GetOk("account_id"); ok {
accountID = v.(string)
}

name := d.Get("name").(string)

input := &s3control.GetMultiRegionAccessPointInput{
AccountId: aws.String(accountID),
Name: aws.String(name),
}

log.Printf("[DEBUG] Reading S3 Multi Region Access Point: %s", input)

output, err := conn.GetMultiRegionAccessPoint(input)

if err != nil {
return diag.Errorf("error reading S3 Multi Region Access Point: %s", err)
}

if output == nil || output.AccessPoint == nil {
return diag.Errorf("error reading S3 Multi Region Access Point (%s): missing access point", accountID)
}

d.SetId(accountID)
d.Set("created_at", aws.TimeValue(output.AccessPoint.CreatedAt).Format(time.RFC3339))
d.Set("name", output.AccessPoint.Name)
d.Set("public_access_block", output.AccessPoint.PublicAccessBlock)
d.Set("regions", output.AccessPoint.Regions)
d.Set("status", output.AccessPoint.Status)

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package s3control_test

import (
"fmt"
sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"regexp"
"testing"

"github.com/aws/aws-sdk-go/service/s3control"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-provider-aws/internal/acctest"
)

func TestAccS3ControlMultiRegionAccessPointDataSource_basic(t *testing.T) {
resourceName := "aws_s3control_multi_region_access_point.test"
dataSourceName := "data.aws_s3control_multi_region_access_point.test"

bucket1Name := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
bucket2Name := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)

if acctest.Partition() == "aws-us-gov" {
t.Skip("S3 Multi-Region Access Point is not supported in GovCloud partition")
}

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t); acctest.PreCheckMultipleRegion(t, 2) },
ErrorCheck: acctest.ErrorCheck(t, s3control.EndpointsID),
ProtoV5ProviderFactories: acctest.ProtoV5FactoriesMultipleRegions(t, 2),
Steps: []resource.TestStep{
{
Config: testAccMultiRegionAccessPointDataSourceConfig_basic(bucket1Name, bucket2Name, rName),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestMatchResourceAttr(resourceName, "alias", regexp.MustCompile(`^[a-z][a-z0-9]*[.]mrap$`)),
resource.TestCheckResourceAttr(resourceName, "name", rName),
resource.TestCheckResourceAttrSet(resourceName, "created_at"),
resource.TestCheckResourceAttrPair(resourceName, "details.0.public_access_block.0.block_public_acls", dataSourceName, "public_access_block.0.block_public_acls"),
resource.TestCheckResourceAttrPair(resourceName, "details.0.public_access_block.0.block_public_policy", dataSourceName, "public_access_block.0.block_public_policy"),
resource.TestCheckResourceAttrPair(resourceName, "details.0.public_access_block.0.ignore_public_acls", dataSourceName, "public_access_block.0.ignore_public_acls"),
resource.TestCheckResourceAttrPair(resourceName, "details.0.public_access_block.0.restrict_public_buckets", dataSourceName, "public_access_block.0.restrict_public_buckets"),
resource.TestCheckTypeSetElemNestedAttrs(resourceName, "details.0.region.*", map[string]string{
"bucket": bucket1Name,
}),
resource.TestCheckTypeSetElemNestedAttrs(resourceName, "details.0.region.*", map[string]string{
"bucket": bucket2Name,
}),
resource.TestCheckResourceAttr(resourceName, "status", s3control.MultiRegionAccessPointStatusReady),
),
},
},
})
}

func testAccMultiRegionAccessPointDataSource_base(bucket1Name string, bucket2Name string, rName string) string {
return acctest.ConfigCompose(
acctest.ConfigMultipleRegionProvider(2),
fmt.Sprintf(`
resource "aws_s3_bucket" "test1" {
provider = aws
bucket = %[1]q
force_destroy = true
}
resource "aws_s3_bucket" "test2" {
provider = awsalternate
bucket = %[2]q
force_destroy = true
}
resource "aws_s3control_multi_region_access_point" "test" {
provider = aws
details {
name = %[3]q
region {
bucket = aws_s3_bucket.test1.id
}
region {
bucket = aws_s3_bucket.test2.id
}
public_access_block = {
block_public_acls = false
block_public_policy = false
ignore_public_acls = false
restrict_public_buckets = false
}
}
}
`, bucket1Name, bucket2Name, rName))
}

func testAccMultiRegionAccessPointDataSourceConfig_basic(bucket1Name string, bucket2Name string, rName string) string {
return acctest.ConfigCompose(testAccMultiRegionAccessPointDataSource_base(bucket1Name, bucket2Name, rName), fmt.Sprintf(`
data "aws_s3control_multi_region_access_point" "test" {
provider = aws
name = %[1]q
depends_on = [aws_s3control_multi_region_access_point.test]
}
`, rName))
}
7 changes: 7 additions & 0 deletions website/docs/d/s3_multi_region_access_point.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
subcategory: "S3 Control"
layout: "aws"
page_title: "AWS: aws_s3control_multi_region_access_point"
description: |-
Provides S3 multi region access point
---

0 comments on commit a6e4aae

Please sign in to comment.