Skip to content

Commit f8e2a7e

Browse files
authoredMay 10, 2023
feat(object): add bucket policy datasource (#1926)
* feat(object): add bucket policy datasource * documentation * fix check destroy * expect non empty plan when replaying cassettes
1 parent 368c25e commit f8e2a7e

5 files changed

+1084
-0
lines changed
 
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
subcategory: "Object Storage"
3+
page_title: "Scaleway: scaleway_object_bucket_policy"
4+
---
5+
6+
# scaleway_object_bucket_policy
7+
8+
Gets information about the Bucket's policy.
9+
For more information, see [the documentation](https://www.scaleway.com/en/docs/object-storage-feature/).
10+
11+
## Example Usage
12+
13+
```hcl
14+
data "scaleway_object_bucket_policy" "main" {
15+
bucket = "bucket.test.com"
16+
}
17+
```
18+
19+
## Argument Reference
20+
21+
- `bucket` - (Required) The bucket name.
22+
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#zones) in which the Object Storage exists.
23+
- `project_id` - (Defaults to [provider](../index.md#project_id) `project_id`) The ID of the project the bucket is associated with.
24+
25+
26+
## Attributes Reference
27+
28+
In addition to all above arguments, the following attribute is exported:
29+
30+
* `policy` - The bucket's policy in JSON format.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/aws/aws-sdk-go/aws"
8+
"github.com/aws/aws-sdk-go/service/s3"
9+
"github.com/hashicorp/aws-sdk-go-base/tfawserr"
10+
"github.com/hashicorp/terraform-plugin-log/tflog"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/structure"
14+
)
15+
16+
func dataSourceScalewayObjectBucketPolicy() *schema.Resource {
17+
// Generate datasource schema from resource
18+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayObjectBucketPolicy().Schema)
19+
20+
fixDatasourceSchemaFlags(dsSchema, true, "bucket")
21+
addOptionalFieldsToSchema(dsSchema, "region", "project_id")
22+
23+
return &schema.Resource{
24+
ReadContext: dataSourceScalewayObjectBucketPolicyRead,
25+
Schema: dsSchema,
26+
}
27+
}
28+
29+
func dataSourceScalewayObjectBucketPolicyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
30+
s3Client, region, err := s3ClientWithRegion(d, meta)
31+
if err != nil {
32+
return diag.FromErr(err)
33+
}
34+
35+
bucket := expandID(d.Get("bucket"))
36+
tflog.Debug(ctx, fmt.Sprintf("bucket name: %s", bucket))
37+
38+
_ = d.Set("region", region)
39+
40+
tflog.Debug(ctx, fmt.Sprintf("[DEBUG] SCW bucket policy, read for bucket: %s", d.Id()))
41+
policy, err := s3Client.GetBucketPolicyWithContext(ctx, &s3.GetBucketPolicyInput{
42+
Bucket: aws.String(bucket),
43+
})
44+
if err != nil {
45+
if tfawserr.ErrCodeEquals(err, ErrCodeNoSuchBucketPolicy, s3.ErrCodeNoSuchBucket) {
46+
return diag.FromErr(fmt.Errorf("bucket %s doesn't exist or has no policy", bucket))
47+
}
48+
49+
return diag.FromErr(fmt.Errorf("couldn't read bucket %s policy: %s", bucket, err))
50+
}
51+
52+
policyString := "{}"
53+
if err == nil && policy.Policy != nil {
54+
policyString = aws.StringValue(policy.Policy)
55+
}
56+
57+
policyJSON, err := structure.NormalizeJsonString(policyString)
58+
if err != nil {
59+
return diag.FromErr(fmt.Errorf("policy (%s) is an invalid JSON: %w", policyString, err))
60+
}
61+
62+
_ = d.Set("policy", policyJSON)
63+
64+
acl, err := s3Client.GetBucketAclWithContext(ctx, &s3.GetBucketAclInput{
65+
Bucket: aws.String(bucket),
66+
})
67+
if err != nil {
68+
return diag.FromErr(fmt.Errorf("couldn't read bucket acl: %s", err))
69+
}
70+
_ = d.Set("project_id", normalizeOwnerID(acl.Owner.ID))
71+
72+
d.SetId(newRegionalIDString(region, bucket))
73+
return nil
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package scaleway
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
)
10+
11+
func TestAccScalewayDataSourceObjectBucketPolicy_Basic(t *testing.T) {
12+
tt := NewTestTools(t)
13+
defer tt.Cleanup()
14+
15+
bucketName := sdkacctest.RandomWithPrefix("test-acc-scw-obp-data-basic")
16+
17+
resource.ParallelTest(t, resource.TestCase{
18+
PreCheck: func() { testAccPreCheck(t) },
19+
ProviderFactories: tt.ProviderFactories,
20+
CheckDestroy: testAccCheckScalewayObjectBucketDestroy(tt),
21+
Steps: []resource.TestStep{
22+
{
23+
Config: fmt.Sprintf(`
24+
resource "scaleway_object_bucket" "main" {
25+
name = "%[1]s"
26+
}
27+
28+
resource "scaleway_object_bucket_policy" "main" {
29+
bucket = scaleway_object_bucket.main.name
30+
policy = jsonencode(
31+
{
32+
Id = "MyPolicy"
33+
Statement = [
34+
{
35+
Action = [
36+
"s3:ListBucket",
37+
"s3:GetObject",
38+
]
39+
Effect = "Allow"
40+
Principal = {
41+
SCW = "*"
42+
}
43+
Resource = [
44+
"${scaleway_object_bucket.main.name}",
45+
"${scaleway_object_bucket.main.name}/*",
46+
]
47+
Sid = "GrantToEveryone"
48+
},
49+
]
50+
Version = "2012-10-17"
51+
}
52+
)
53+
}
54+
55+
data "scaleway_object_bucket_policy" "selected" {
56+
bucket = scaleway_object_bucket_policy.main.bucket
57+
}
58+
`, bucketName),
59+
Check: resource.ComposeTestCheckFunc(
60+
resource.TestCheckResourceAttr("data.scaleway_object_bucket_policy.selected", "bucket", bucketName),
61+
resource.TestCheckResourceAttrSet("data.scaleway_object_bucket_policy.selected", "policy"),
62+
resource.TestCheckResourceAttrPair("data.scaleway_object_bucket_policy.selected", "policy", "scaleway_object_bucket_policy.main", "policy"),
63+
),
64+
ExpectNonEmptyPlan: !*UpdateCassettes,
65+
},
66+
},
67+
})
68+
}

‎scaleway/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
209209
"scaleway_lb_routes": dataSourceScalewayLbRoutes(),
210210
"scaleway_marketplace_image": dataSourceScalewayMarketplaceImage(),
211211
"scaleway_object_bucket": dataSourceScalewayObjectBucket(),
212+
"scaleway_object_bucket_policy": dataSourceScalewayObjectBucketPolicy(),
212213
"scaleway_rdb_acl": dataSourceScalewayRDBACL(),
213214
"scaleway_rdb_instance": dataSourceScalewayRDBInstance(),
214215
"scaleway_rdb_database": dataSourceScalewayRDBDatabase(),

‎scaleway/testdata/data-source-object-bucket-policy-basic.cassette.yaml

+911
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.