Skip to content

Commit 7efc290

Browse files
authored
feat(object): add tags to buckets (#501)
1 parent 7efa68e commit 7efc290

4 files changed

+95
-0
lines changed

scaleway/helpers_object.go

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package scaleway
2+
3+
import (
4+
"github.com/aws/aws-sdk-go/service/s3"
5+
"github.com/scaleway/scaleway-sdk-go/scw"
6+
)
7+
8+
func flattenObjectBucketTags(tagsSet []*s3.Tag) map[string]interface{} {
9+
tags := map[string]interface{}{}
10+
11+
for _, tagSet := range tagsSet {
12+
var key string
13+
var value string
14+
if tagSet.Key != nil {
15+
key = *tagSet.Key
16+
}
17+
if tagSet.Value != nil {
18+
value = *tagSet.Value
19+
}
20+
tags[key] = value
21+
}
22+
23+
return tags
24+
}
25+
26+
func expandObjectBucketTags(tags interface{}) []*s3.Tag {
27+
tagsSet := make([]*s3.Tag, 0)
28+
29+
for key, value := range tags.(map[string]interface{}) {
30+
tagsSet = append(tagsSet, &s3.Tag{
31+
Key: &key,
32+
Value: scw.StringPtr(value.(string)),
33+
})
34+
}
35+
36+
return tagsSet
37+
}

scaleway/resource_object_bucket.go

+48
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ func resourceScalewayObjectBucket() *schema.Resource {
3838
s3.ObjectCannedACLAuthenticatedRead,
3939
}, false),
4040
},
41+
"tags": {
42+
Type: schema.TypeMap,
43+
Elem: &schema.Schema{
44+
Type: schema.TypeString,
45+
},
46+
Optional: true,
47+
Description: "The tags associated with this bucket",
48+
},
4149
"region": regionSchema(),
4250
},
4351
}
@@ -60,6 +68,20 @@ func resourceScalewayObjectBucketCreate(d *schema.ResourceData, m interface{}) e
6068
return err
6169
}
6270

71+
tagsSet := expandObjectBucketTags(d.Get("tags"))
72+
73+
if len(tagsSet) > 0 {
74+
_, err = s3Client.PutBucketTagging(&s3.PutBucketTaggingInput{
75+
Bucket: aws.String(bucketName),
76+
Tagging: &s3.Tagging{
77+
TagSet: tagsSet,
78+
},
79+
})
80+
if err != nil {
81+
return err
82+
}
83+
}
84+
6385
d.SetId(newRegionalId(region, bucketName))
6486

6587
return resourceScalewayObjectBucketRead(d, m)
@@ -94,6 +116,21 @@ func resourceScalewayObjectBucketRead(d *schema.ResourceData, m interface{}) err
94116
return fmt.Errorf("couldn't read bucket: %s", err)
95117
}
96118

119+
var tagsSet []*s3.Tag
120+
121+
tagsResponse, err := s3Client.GetBucketTagging(&s3.GetBucketTaggingInput{
122+
Bucket: aws.String(bucketName),
123+
})
124+
if err != nil {
125+
if serr, ok := err.(awserr.Error); !ok || serr.Code() != "NoSuchTagSet" {
126+
return fmt.Errorf("couldn't read tags from bucket: %s", err)
127+
}
128+
} else {
129+
tagsSet = tagsResponse.TagSet
130+
}
131+
132+
_ = d.Set("tags", flattenObjectBucketTags(tagsSet))
133+
97134
return nil
98135
}
99136

@@ -116,6 +153,17 @@ func resourceScalewayObjectBucketUpdate(d *schema.ResourceData, m interface{}) e
116153
}
117154
}
118155

156+
if d.HasChange("tags") {
157+
tagsSet := expandObjectBucketTags(d.Get("tags"))
158+
159+
_, err = s3Client.PutBucketTagging(&s3.PutBucketTaggingInput{
160+
Bucket: aws.String(bucketName),
161+
Tagging: &s3.Tagging{
162+
TagSet: tagsSet,
163+
},
164+
})
165+
}
166+
119167
return resourceScalewayObjectBucketRead(d, m)
120168
}
121169

scaleway/resource_object_bucket_test.go

+6
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

+4
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) A list of tags (key / value) for 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)