Skip to content

Commit

Permalink
test(object): bucket ACL take on bucket's region (#2261)
Browse files Browse the repository at this point in the history
* test(object): acl: all tests OK on fr-par

* test(object): acl: remove region attribute on the acl resource

* test(object): acl: all tests OK on nl-ams

* test(object): acl: remove retry
  • Loading branch information
Mia-Cross authored Dec 6, 2023
1 parent 3cd948a commit 1e549a1
Show file tree
Hide file tree
Showing 7 changed files with 1,820 additions and 820 deletions.
8 changes: 4 additions & 4 deletions docs/resources/object_bucket_acl.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ resource "scaleway_object_bucket" "some_bucket" {
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
acl = "private"
}
```
Expand All @@ -33,7 +33,7 @@ resource "scaleway_object_bucket" "main" {
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
access_control_policy {
grant {
grantee {
Expand Down Expand Up @@ -62,12 +62,12 @@ resource "scaleway_object_bucket_acl" "main" {

The following arguments are supported:

* `bucket` - (Required) The name of the bucket.
* `bucket` - (Required) The name of the bucket, or its Terraform ID.
* `acl` - (Optional) The canned ACL you want to apply to the bucket.
* `access_control_policy` - (Optional, Conflicts with acl) A configuration block that sets the ACL permissions for an object per grantee documented below.
* `expected_bucket_owner` - (Optional, Forces new resource) The project ID of the expected bucket owner.
* `region` - (Optional) The [region](https://developers.scaleway.com/en/quickstart/#region-definition) in which the bucket should be created.
* `project_id` - (Defaults to [provider](../index.md#project_id) `project_id`) The ID of the project the bucket is associated with.
* `project_id` - (Defaults to [provider](../index.md#arguments-reference) `project_id`) The ID of the project the bucket is associated with.


## The ACL
Expand Down
33 changes: 19 additions & 14 deletions scaleway/resource_object_bucket_acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"context"
"fmt"
"strings"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
Expand Down Expand Up @@ -117,11 +116,12 @@ func resourceScalewayObjectBucketACL() *schema.Resource {
}, false),
},
"bucket": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.StringLenBetween(1, 63),
Description: "The bucket name.",
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.StringLenBetween(1, 63),
Description: "The bucket's name or regional ID.",
DiffSuppressFunc: diffSuppressFuncLocality,
},
"expected_bucket_owner": {
Type: schema.TypeString,
Expand All @@ -142,7 +142,18 @@ func resourceBucketACLCreate(ctx context.Context, d *schema.ResourceData, meta i
return diag.FromErr(err)
}

bucket := expandID(d.Get("bucket").(string))
regionalID := expandRegionalID(d.Get("bucket"))
bucket := regionalID.ID
bucketRegion := regionalID.Region

if bucketRegion != "" && bucketRegion != region {
conn, err = s3ClientForceRegion(d, meta, bucketRegion.String())
if err != nil {
return diag.FromErr(err)
}
region = bucketRegion
}

expectedBucketOwner := d.Get("expected_bucket_owner").(string)
acl := d.Get("acl").(string)

Expand All @@ -162,13 +173,7 @@ func resourceBucketACLCreate(ctx context.Context, d *schema.ResourceData, meta i
input.AccessControlPolicy = expandBucketACLAccessControlPolicy(v.([]interface{}))
}

out, err := retryWhenAWSErrCodeEquals(ctx, []string{s3.ErrCodeNoSuchBucket}, &RetryWhenConfig[*s3.PutBucketAclOutput]{
Timeout: d.Timeout(schema.TimeoutCreate),
Interval: 5 * time.Second,
Function: func() (*s3.PutBucketAclOutput, error) {
return conn.PutBucketAclWithContext(ctx, input)
},
})
out, err := conn.PutBucketAclWithContext(ctx, input)
if err != nil {
return diag.FromErr(fmt.Errorf("error putting Object Storage ACL: %s", err))
}
Expand Down
91 changes: 72 additions & 19 deletions scaleway/resource_object_bucket_acl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package scaleway

import (
"fmt"
"regexp"
"testing"

sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
Expand All @@ -11,7 +12,7 @@ import (
func TestAccScalewayObjectBucketACL_Basic(t *testing.T) {
tt := NewTestTools(t)
defer tt.Cleanup()
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scaleway-object-acl-basic")
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scw-object-acl-basic")

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Expand All @@ -22,16 +23,16 @@ func TestAccScalewayObjectBucketACL_Basic(t *testing.T) {
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%s"
region = "nl-ams"
region = "%s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
acl = "private"
region = "nl-ams"
}
`, testBucketName),
`, testBucketName, objectTestsMainRegion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayObjectBucketExistsForceRegion(tt, "scaleway_object_bucket.main", true),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "bucket", testBucketName),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "acl", "private"),
),
Expand All @@ -40,16 +41,16 @@ func TestAccScalewayObjectBucketACL_Basic(t *testing.T) {
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%s"
region = "nl-ams"
region = "%s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
acl = "public-read"
region = "nl-ams"
}
`, testBucketName),
`, testBucketName, objectTestsMainRegion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayObjectBucketExistsForceRegion(tt, "scaleway_object_bucket.main", true),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "bucket", testBucketName),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "acl", "public-read"),
),
Expand All @@ -61,7 +62,7 @@ func TestAccScalewayObjectBucketACL_Basic(t *testing.T) {
func TestAccScalewayObjectBucketACL_Grantee(t *testing.T) {
tt := NewTestTools(t)
defer tt.Cleanup()
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scaleway-object-acl-grantee")
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scw-object-acl-grantee")

ownerID := "105bdce1-64c0-48ab-899d-868455867ecf"
ownerIDChild := "50ab77d5-56bd-4981-a118-4e0fa5309b59"
Expand All @@ -74,10 +75,11 @@ func TestAccScalewayObjectBucketACL_Grantee(t *testing.T) {
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%[1]s"
region = "%[3]s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
access_control_policy {
grant {
grantee {
Expand All @@ -100,20 +102,21 @@ func TestAccScalewayObjectBucketACL_Grantee(t *testing.T) {
}
}
}
`, testBucketName, ownerID),
`, testBucketName, ownerID, objectTestsMainRegion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayObjectBucketExists(tt, "scaleway_object_bucket.main"),
testAccCheckScalewayObjectBucketExistsForceRegion(tt, "scaleway_object_bucket.main", true),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "bucket", testBucketName),
),
},
{
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%[1]s"
region = "%[4]s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
access_control_policy {
grant {
grantee {
Expand Down Expand Up @@ -144,9 +147,9 @@ func TestAccScalewayObjectBucketACL_Grantee(t *testing.T) {
}
}
}
`, testBucketName, ownerID, ownerIDChild),
`, testBucketName, ownerID, ownerIDChild, objectTestsMainRegion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayObjectBucketExists(tt, "scaleway_object_bucket.main"),
testAccCheckScalewayObjectBucketExistsForceRegion(tt, "scaleway_object_bucket.main", true),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "bucket", testBucketName),
),
},
Expand All @@ -162,7 +165,7 @@ func TestAccScalewayObjectBucketACL_Grantee(t *testing.T) {
func TestAccScalewayObjectBucketACL_GranteeWithOwner(t *testing.T) {
tt := NewTestTools(t)
defer tt.Cleanup()
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scaleway-object-acl-grantee-owner")
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scw-object-acl-owner")
ownerID := "105bdce1-64c0-48ab-899d-868455867ecf"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Expand All @@ -173,10 +176,11 @@ func TestAccScalewayObjectBucketACL_GranteeWithOwner(t *testing.T) {
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%[1]s"
region = "%[3]s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
bucket = scaleway_object_bucket.main.id
expected_bucket_owner = "%[2]s"
access_control_policy {
grant {
Expand All @@ -200,9 +204,58 @@ func TestAccScalewayObjectBucketACL_GranteeWithOwner(t *testing.T) {
}
}
}
`, testBucketName, ownerID),
`, testBucketName, ownerID, objectTestsMainRegion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayObjectBucketExistsForceRegion(tt, "scaleway_object_bucket.main", true),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "bucket", testBucketName),
),
},
},
})
}

func TestAccScalewayObjectBucketACL_WithBucketName(t *testing.T) {
tt := NewTestTools(t)
defer tt.Cleanup()
testBucketName := sdkacctest.RandomWithPrefix("test-acc-scw-object-acl-name")

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: testAccCheckScalewayObjectBucketDestroy(tt),
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%s"
region = "%s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
acl = "public-read"
}
`, testBucketName, objectTestsMainRegion),
ExpectError: regexp.MustCompile("error putting Object Storage ACL: NoSuchBucket: The specified bucket does not exist"),
},
{
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "main" {
name = "%s"
region = "%s"
}
resource "scaleway_object_bucket_acl" "main" {
bucket = scaleway_object_bucket.main.name
acl = "public-read"
region = "%[2]s"
}
`, testBucketName, objectTestsMainRegion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayObjectBucketExistsForceRegion(tt, "scaleway_object_bucket.main", true),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "bucket", testBucketName),
resource.TestCheckResourceAttr("scaleway_object_bucket_acl.main", "acl", "public-read"),
),
},
},
Expand Down
Loading

0 comments on commit 1e549a1

Please sign in to comment.