Skip to content

Commit 5448484

Browse files
committed
feat(object): add tags to buckets
Signed-off-by: Patrik Cyvoct <[email protected]>
1 parent 782cee3 commit 5448484

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

scaleway/resource_object_bucket.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/aws/aws-sdk-go/service/s3"
99
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
1010
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
11+
"github.com/scaleway/scaleway-sdk-go/scw"
1112
)
1213

1314
func resourceScalewayObjectBucket() *schema.Resource {
@@ -38,6 +39,14 @@ func resourceScalewayObjectBucket() *schema.Resource {
3839
s3.ObjectCannedACLAuthenticatedRead,
3940
}, false),
4041
},
42+
"tags": {
43+
Type: schema.TypeMap,
44+
Elem: &schema.Schema{
45+
Type: schema.TypeString,
46+
},
47+
Optional: true,
48+
Description: "The tags associated with this bucket",
49+
},
4150
"region": regionSchema(),
4251
},
4352
}
@@ -60,6 +69,27 @@ func resourceScalewayObjectBucketCreate(d *schema.ResourceData, m interface{}) e
6069
return err
6170
}
6271

72+
tagsSet := make([]*s3.Tag, 0)
73+
74+
for key, value := range d.Get("tags").(map[string]interface{}) {
75+
tagsSet = append(tagsSet, &s3.Tag{
76+
Key: &key,
77+
Value: scw.StringPtr(value.(string)),
78+
})
79+
}
80+
81+
if len(tagsSet) > 0 {
82+
_, err = s3Client.PutBucketTagging(&s3.PutBucketTaggingInput{
83+
Bucket: aws.String(bucketName),
84+
Tagging: &s3.Tagging{
85+
TagSet: tagsSet,
86+
},
87+
})
88+
if err != nil {
89+
return err
90+
}
91+
}
92+
6393
d.SetId(newRegionalId(region, bucketName))
6494

6595
return resourceScalewayObjectBucketRead(d, m)
@@ -94,6 +124,35 @@ func resourceScalewayObjectBucketRead(d *schema.ResourceData, m interface{}) err
94124
return fmt.Errorf("couldn't read bucket: %s", err)
95125
}
96126

127+
var tagsSet []*s3.Tag
128+
129+
tagsResponse, err := s3Client.GetBucketTagging(&s3.GetBucketTaggingInput{
130+
Bucket: aws.String(bucketName),
131+
})
132+
if err != nil {
133+
if serr, ok := err.(awserr.Error); !ok || serr.Code() != "NoSuchTagSet" {
134+
return fmt.Errorf("couldn't read tags from bucket: %s", err)
135+
}
136+
} else {
137+
tagsSet = tagsResponse.TagSet
138+
}
139+
140+
tags := map[string]interface{}{}
141+
142+
for _, tagSet := range tagsSet {
143+
var key string
144+
var value string
145+
if tagSet.Key != nil {
146+
key = *tagSet.Key
147+
}
148+
if tagSet.Value != nil {
149+
value = *tagSet.Value
150+
}
151+
tags[key] = value
152+
}
153+
154+
_ = d.Set("tags", tags)
155+
97156
return nil
98157
}
99158

@@ -116,6 +175,24 @@ func resourceScalewayObjectBucketUpdate(d *schema.ResourceData, m interface{}) e
116175
}
117176
}
118177

178+
if d.HasChange("tags") {
179+
tagsSet := make([]*s3.Tag, 0)
180+
181+
for key, value := range d.Get("tags").(map[string]interface{}) {
182+
tagsSet = append(tagsSet, &s3.Tag{
183+
Key: &key,
184+
Value: scw.StringPtr(value.(string)),
185+
})
186+
}
187+
188+
_, err = s3Client.PutBucketTagging(&s3.PutBucketTaggingInput{
189+
Bucket: aws.String(bucketName),
190+
Tagging: &s3.Tagging{
191+
TagSet: tagsSet,
192+
},
193+
})
194+
}
195+
119196
return resourceScalewayObjectBucketRead(d, m)
120197
}
121198

scaleway/resource_object_bucket_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ var (
3232
var testAccCheckScalewayObjectBucket = fmt.Sprintf(`
3333
resource "scaleway_object_bucket" "base" {
3434
name = "%s"
35+
tags = {
36+
foo = "bar"
37+
}
3538
}
3639
3740
resource "scaleway_object_bucket" "ams-bucket" {
@@ -63,6 +66,8 @@ func TestAccScalewayObjectBucket(t *testing.T) {
6366
Check: resource.ComposeTestCheckFunc(
6467
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "name", testBucketName),
6568
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "acl", testBucketACL),
69+
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "tags.%", "1"),
70+
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "tags.foo", "bar"),
6671
resource.TestCheckResourceAttr("scaleway_object_bucket.ams-bucket", "name", testBucketNameAms),
6772
resource.TestCheckResourceAttr("scaleway_object_bucket.par-bucket", "name", testBucketNamePar),
6873
),
@@ -72,6 +77,7 @@ func TestAccScalewayObjectBucket(t *testing.T) {
7277
Check: resource.ComposeTestCheckFunc(
7378
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "name", testBucketName),
7479
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "acl", testBucketUpdatedACL),
80+
resource.TestCheckResourceAttr("scaleway_object_bucket.base", "tags.%", "0"),
7581
),
7682
},
7783
},

website/docs/r/object_bucket.html.markdown

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ Creates and manages Scaleway object storage buckets. For more information, see [
1515
resource "scaleway_object_bucket" "some_bucket" {
1616
name = "some-unique-name"
1717
acl = "private"
18+
tags = {
19+
key = "value"
20+
}
1821
}
1922
```
2023

@@ -23,6 +26,7 @@ resource "scaleway_object_bucket" "some_bucket" {
2326
The following arguments are supported:
2427

2528
* `name` - (Required) The name of the bucket.
29+
* `tags` - (Optional) The tags of the bucket.
2630
* `acl` - (Optional) The [canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) you want to apply to the bucket.
2731
* `region` - (Optional) The [region](https://developers.scaleway.com/en/quickstart/#region-definition) in which the bucket should be created.
2832

0 commit comments

Comments
 (0)