1
1
package scaleway
2
2
3
3
import (
4
+ "bytes"
5
+ "context"
4
6
"errors"
5
7
"fmt"
8
+ "hash/crc32"
6
9
"net/http"
7
10
"os"
8
11
"strings"
@@ -13,12 +16,15 @@ import (
13
16
"github.com/aws/aws-sdk-go/aws/credentials"
14
17
"github.com/aws/aws-sdk-go/aws/session"
15
18
"github.com/aws/aws-sdk-go/service/s3"
19
+ "github.com/hashicorp/aws-sdk-go-base/tfawserr"
20
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
16
21
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
17
22
"github.com/scaleway/scaleway-sdk-go/scw"
18
23
)
19
24
20
25
const (
21
26
defaultObjectBucketTimeout = 10 * time .Minute
27
+ retryOnAWSAPI = 2 * time .Minute
22
28
)
23
29
24
30
func newS3Client (httpClient * http.Client , region , accessKey , secretKey string ) (* s3.S3 , error ) {
@@ -195,3 +201,81 @@ func expandBucketCORS(rawCors []interface{}, bucket string) []*s3.CORSRule {
195
201
}
196
202
return rules
197
203
}
204
+
205
+ func validBucketLifecycleTimestamp (v interface {}, k string ) (ws []string , errors []error ) {
206
+ value := v .(string )
207
+ _ , err := time .Parse (time .RFC3339 , fmt .Sprintf ("%sT00:00:00Z" , value ))
208
+ if err != nil {
209
+ errors = append (errors , fmt .Errorf (
210
+ "%q cannot be parsed as RFC3339 Timestamp Format" , value ))
211
+ }
212
+
213
+ return
214
+ }
215
+
216
+ func transitionHash (v interface {}) int {
217
+ var buf bytes.Buffer
218
+ m , ok := v .(map [string ]interface {})
219
+
220
+ if ! ok {
221
+ return 0
222
+ }
223
+
224
+ if v , ok := m ["date" ]; ok {
225
+ buf .WriteString (fmt .Sprintf ("%s-" , v .(string )))
226
+ }
227
+ if v , ok := m ["days" ]; ok {
228
+ buf .WriteString (fmt .Sprintf ("%d-" , v .(int )))
229
+ }
230
+ if v , ok := m ["storage_class" ]; ok {
231
+ buf .WriteString (fmt .Sprintf ("%s-" , v .(string )))
232
+ }
233
+ return StringHashcode (buf .String ())
234
+ }
235
+
236
+ // StringHashcode hashes a string to a unique hashcode.
237
+ //
238
+ // crc32 returns a uint32, but for our use we need
239
+ // and non-negative integer. Here we cast to an integer
240
+ // and invert it if the result is negative.
241
+ func StringHashcode (s string ) int {
242
+ v := int (crc32 .ChecksumIEEE ([]byte (s )))
243
+ if v >= 0 {
244
+ return v
245
+ }
246
+ if - v >= 0 {
247
+ return - v
248
+ }
249
+ // v == MinInt
250
+ return 0
251
+ }
252
+
253
+ func retryOnAWSCode (ctx context.Context , code string , f func () (interface {}, error )) (interface {}, error ) {
254
+ var resp interface {}
255
+ err := resource .RetryContext (ctx , retryOnAWSAPI , func () * resource.RetryError {
256
+ var err error
257
+ resp , err = f ()
258
+ if err != nil {
259
+ if tfawserr .ErrCodeEquals (err , code ) {
260
+ return resource .RetryableError (err )
261
+ }
262
+ return resource .NonRetryableError (err )
263
+ }
264
+ return nil
265
+ })
266
+
267
+ if TimedOut (err ) {
268
+ resp , err = f ()
269
+ }
270
+
271
+ return resp , err
272
+ }
273
+
274
+ // TransitionSCWStorageClassValues returns all elements of the TransitionStorageClass enum supported by scaleway
275
+ func TransitionSCWStorageClassValues () []string {
276
+ return []string {
277
+ s3 .TransitionStorageClassGlacier ,
278
+ s3 .TransitionStorageClassStandardIa ,
279
+ s3 .TransitionStorageClassOnezoneIa ,
280
+ }
281
+ }
0 commit comments