@@ -4,12 +4,12 @@ import (
4
4
"context"
5
5
"fmt"
6
6
7
- "github.com/aws/aws-sdk-go/aws"
8
7
"github.com/aws/aws-sdk-go/aws/awserr"
9
8
"github.com/aws/aws-sdk-go/service/s3"
10
9
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11
10
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12
11
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
12
+ "github.com/scaleway/scaleway-sdk-go/scw"
13
13
)
14
14
15
15
func resourceScalewayObjectBucket () * schema.Resource {
@@ -56,6 +56,38 @@ func resourceScalewayObjectBucket() *schema.Resource {
56
56
Description : "Endpoint of the bucket" ,
57
57
Computed : true ,
58
58
},
59
+ "cors_rule" : {
60
+ Type : schema .TypeList ,
61
+ Optional : true ,
62
+ Elem : & schema.Resource {
63
+ Schema : map [string ]* schema.Schema {
64
+ "allowed_headers" : {
65
+ Type : schema .TypeList ,
66
+ Optional : true ,
67
+ Elem : & schema.Schema {Type : schema .TypeString },
68
+ },
69
+ "allowed_methods" : {
70
+ Type : schema .TypeList ,
71
+ Required : true ,
72
+ Elem : & schema.Schema {Type : schema .TypeString },
73
+ },
74
+ "allowed_origins" : {
75
+ Type : schema .TypeList ,
76
+ Required : true ,
77
+ Elem : & schema.Schema {Type : schema .TypeString },
78
+ },
79
+ "expose_headers" : {
80
+ Type : schema .TypeList ,
81
+ Optional : true ,
82
+ Elem : & schema.Schema {Type : schema .TypeString },
83
+ },
84
+ "max_age_seconds" : {
85
+ Type : schema .TypeInt ,
86
+ Optional : true ,
87
+ },
88
+ },
89
+ },
90
+ },
59
91
"region" : regionSchema (),
60
92
"versioning" : {
61
93
Type : schema .TypeList ,
@@ -86,8 +118,8 @@ func resourceScalewayObjectBucketCreate(ctx context.Context, d *schema.ResourceD
86
118
}
87
119
88
120
_ , err = s3Client .CreateBucketWithContext (ctx , & s3.CreateBucketInput {
89
- Bucket : aws . String (bucketName ),
90
- ACL : aws . String (acl ),
121
+ Bucket : scw . StringPtr (bucketName ),
122
+ ACL : scw . StringPtr (acl ),
91
123
})
92
124
if err != nil {
93
125
return diag .FromErr (err )
@@ -97,7 +129,7 @@ func resourceScalewayObjectBucketCreate(ctx context.Context, d *schema.ResourceD
97
129
98
130
if len (tagsSet ) > 0 {
99
131
_ , err = s3Client .PutBucketTaggingWithContext (ctx , & s3.PutBucketTaggingInput {
100
- Bucket : aws . String (bucketName ),
132
+ Bucket : scw . StringPtr (bucketName ),
101
133
Tagging : & s3.Tagging {
102
134
TagSet : tagsSet ,
103
135
},
@@ -109,6 +141,54 @@ func resourceScalewayObjectBucketCreate(ctx context.Context, d *schema.ResourceD
109
141
110
142
d .SetId (newRegionalIDString (region , bucketName ))
111
143
144
+ return resourceScalewayObjectBucketUpdate (ctx , d , meta )
145
+ }
146
+
147
+ func resourceScalewayObjectBucketUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
148
+ s3Client , _ , bucketName , err := s3ClientWithRegionAndName (meta , d .Id ())
149
+ if err != nil {
150
+ return diag .FromErr (err )
151
+ }
152
+
153
+ if d .HasChange ("acl" ) {
154
+ acl := d .Get ("acl" ).(string )
155
+
156
+ _ , err := s3Client .PutBucketAclWithContext (ctx , & s3.PutBucketAclInput {
157
+ Bucket : scw .StringPtr (bucketName ),
158
+ ACL : scw .StringPtr (acl ),
159
+ })
160
+ if err != nil {
161
+ l .Errorf ("Couldn't update bucket ACL: %s" , err )
162
+ return diag .FromErr (fmt .Errorf ("couldn't update bucket ACL: %s" , err ))
163
+ }
164
+ }
165
+
166
+ if d .HasChange ("versioning" ) {
167
+ if err := resourceScalewayObjectBucketVersioningUpdate (ctx , s3Client , d ); err != nil {
168
+ return diag .FromErr (err )
169
+ }
170
+ }
171
+
172
+ if d .HasChange ("tags" ) {
173
+ tagsSet := expandObjectBucketTags (d .Get ("tags" ))
174
+
175
+ _ , err = s3Client .PutBucketTaggingWithContext (ctx , & s3.PutBucketTaggingInput {
176
+ Bucket : scw .StringPtr (bucketName ),
177
+ Tagging : & s3.Tagging {
178
+ TagSet : tagsSet ,
179
+ },
180
+ })
181
+ if err != nil {
182
+ return diag .FromErr (err )
183
+ }
184
+ }
185
+
186
+ if d .HasChange ("cors_rule" ) {
187
+ if err := resourceScalewayS3BucketCorsUpdate (ctx , s3Client , d ); err != nil {
188
+ return diag .FromErr (err )
189
+ }
190
+ }
191
+
112
192
return resourceScalewayObjectBucketRead (ctx , d , meta )
113
193
}
114
194
@@ -130,7 +210,7 @@ func resourceScalewayObjectBucketRead(ctx context.Context, d *schema.ResourceDat
130
210
// AWS has the same issue: https://github.com/terraform-providers/terraform-provider-aws/issues/6193
131
211
132
212
_ , err = s3Client .ListObjectsWithContext (ctx , & s3.ListObjectsInput {
133
- Bucket : aws . String (bucketName ),
213
+ Bucket : scw . StringPtr (bucketName ),
134
214
})
135
215
if err != nil {
136
216
if s3err , ok := err .(awserr.Error ); ok && s3err .Code () == s3 .ErrCodeNoSuchBucket {
@@ -144,7 +224,7 @@ func resourceScalewayObjectBucketRead(ctx context.Context, d *schema.ResourceDat
144
224
var tagsSet []* s3.Tag
145
225
146
226
tagsResponse , err := s3Client .GetBucketTaggingWithContext (ctx , & s3.GetBucketTaggingInput {
147
- Bucket : aws . String (bucketName ),
227
+ Bucket : scw . StringPtr (bucketName ),
148
228
})
149
229
if err != nil {
150
230
if s3err , ok := err .(awserr.Error ); ! ok || s3err .Code () != "NoSuchTagSet" {
@@ -158,9 +238,22 @@ func resourceScalewayObjectBucketRead(ctx context.Context, d *schema.ResourceDat
158
238
159
239
_ = d .Set ("endpoint" , objectBucketEndpointURL (bucketName , region ))
160
240
241
+ // Read the CORS
242
+ corsResponse , err := s3Client .GetBucketCorsWithContext (ctx , & s3.GetBucketCorsInput {
243
+ Bucket : scw .StringPtr (bucketName ),
244
+ })
245
+
246
+ if err != nil && ! isS3Err (err , "NoSuchCORSConfiguration" , "" ) {
247
+ return diag .FromErr (fmt .Errorf ("error getting S3 Bucket CORS configuration: %s" , err ))
248
+ }
249
+
250
+ _ = d .Set ("cors_rule" , flattenBucketCORS (corsResponse ))
251
+
252
+ _ = d .Set ("endpoint" , fmt .Sprintf ("https://%s.s3.%s.scw.cloud" , bucketName , region ))
253
+
161
254
// Read the versioning configuration
162
255
versioningResponse , err := s3Client .GetBucketVersioningWithContext (ctx , & s3.GetBucketVersioningInput {
163
- Bucket : aws . String (bucketName ),
256
+ Bucket : scw . StringPtr (bucketName ),
164
257
})
165
258
if err != nil {
166
259
return diag .FromErr (err )
@@ -170,56 +263,14 @@ func resourceScalewayObjectBucketRead(ctx context.Context, d *schema.ResourceDat
170
263
return nil
171
264
}
172
265
173
- func resourceScalewayObjectBucketUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
174
- s3Client , _ , bucketName , err := s3ClientWithRegionAndName (meta , d .Id ())
175
- if err != nil {
176
- return diag .FromErr (err )
177
- }
178
-
179
- if d .HasChange ("acl" ) {
180
- acl := d .Get ("acl" ).(string )
181
-
182
- _ , err := s3Client .PutBucketAclWithContext (ctx , & s3.PutBucketAclInput {
183
- Bucket : aws .String (bucketName ),
184
- ACL : aws .String (acl ),
185
- })
186
- if err != nil {
187
- l .Errorf ("Couldn't update bucket ACL: %s" , err )
188
- return diag .FromErr (fmt .Errorf ("couldn't update bucket ACL: %s" , err ))
189
- }
190
- }
191
-
192
- if d .HasChange ("versioning" ) {
193
- if err := resourceScalewayObjectBucketVersioningUpdate (ctx , s3Client , d ); err != nil {
194
- return diag .FromErr (err )
195
- }
196
- }
197
-
198
- if d .HasChange ("tags" ) {
199
- tagsSet := expandObjectBucketTags (d .Get ("tags" ))
200
-
201
- _ , err = s3Client .PutBucketTaggingWithContext (ctx , & s3.PutBucketTaggingInput {
202
- Bucket : aws .String (bucketName ),
203
- Tagging : & s3.Tagging {
204
- TagSet : tagsSet ,
205
- },
206
- })
207
- if err != nil {
208
- return diag .FromErr (err )
209
- }
210
- }
211
-
212
- return resourceScalewayObjectBucketRead (ctx , d , meta )
213
- }
214
-
215
266
func resourceScalewayObjectBucketDelete (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
216
267
s3Client , _ , bucketName , err := s3ClientWithRegionAndName (meta , d .Id ())
217
268
if err != nil {
218
269
return diag .FromErr (err )
219
270
}
220
271
221
272
_ , err = s3Client .DeleteBucketWithContext (ctx , & s3.DeleteBucketInput {
222
- Bucket : aws . String (bucketName ),
273
+ Bucket : scw . StringPtr (bucketName ),
223
274
})
224
275
if err != nil {
225
276
return diag .FromErr (err )
@@ -234,7 +285,7 @@ func resourceScalewayObjectBucketVersioningUpdate(ctx context.Context, s3conn *s
234
285
vc := expandObjectBucketVersioning (v )
235
286
236
287
i := & s3.PutBucketVersioningInput {
237
- Bucket : aws . String (bucketName ),
288
+ Bucket : scw . StringPtr (bucketName ),
238
289
VersioningConfiguration : vc ,
239
290
}
240
291
l .Debugf ("S3 put bucket versioning: %#v" , i )
@@ -246,3 +297,38 @@ func resourceScalewayObjectBucketVersioningUpdate(ctx context.Context, s3conn *s
246
297
247
298
return nil
248
299
}
300
+
301
+ func resourceScalewayS3BucketCorsUpdate (ctx context.Context , s3conn * s3.S3 , d * schema.ResourceData ) error {
302
+ bucketName := d .Get ("name" ).(string )
303
+ rawCors := d .Get ("cors_rule" ).([]interface {})
304
+
305
+ if len (rawCors ) == 0 {
306
+ // Delete CORS
307
+ l .Debugf ("S3 bucket: %s, delete CORS" , bucketName )
308
+
309
+ _ , err := s3conn .DeleteBucketCorsWithContext (ctx , & s3.DeleteBucketCorsInput {
310
+ Bucket : scw .StringPtr (bucketName ),
311
+ })
312
+
313
+ if err != nil {
314
+ return fmt .Errorf ("error deleting S3 CORS: %s" , err )
315
+ }
316
+ } else {
317
+ // Put CORS
318
+ rules := expandBucketCORS (rawCors , bucketName )
319
+ corsInput := & s3.PutBucketCorsInput {
320
+ Bucket : scw .StringPtr (bucketName ),
321
+ CORSConfiguration : & s3.CORSConfiguration {
322
+ CORSRules : rules ,
323
+ },
324
+ }
325
+ l .Debugf ("S3 bucket: %s, put CORS: %#v" , bucketName , corsInput )
326
+
327
+ _ , err := s3conn .PutBucketCorsWithContext (ctx , corsInput )
328
+ if err != nil {
329
+ return fmt .Errorf ("error putting S3 CORS: %s" , err )
330
+ }
331
+ }
332
+
333
+ return nil
334
+ }
0 commit comments