Skip to content

Commit df6b19a

Browse files
committed
feat(obj): add lifecycle to object-storage
1 parent 5de8d45 commit df6b19a

8 files changed

+986
-1681
lines changed

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ require (
55
github.com/dnaeon/go-vcr v1.2.0
66
github.com/dustin/go-humanize v1.0.0
77
github.com/google/go-cmp v0.5.7
8+
github.com/hashicorp/aws-sdk-go-base v1.0.0
89
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
910
github.com/hashicorp/go-retryablehttp v0.7.0
1011
github.com/hashicorp/terraform-plugin-sdk/v2 v2.10.1

go.sum

+6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj
6767
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
6868
github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
6969
github.com/aws/aws-sdk-go v1.25.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
70+
github.com/aws/aws-sdk-go v1.31.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
7071
github.com/aws/aws-sdk-go v1.42.44 h1:vPlF4cUsdN5ETfvb7ewZFbFZyB6Rsfndt3kS2XqLXKo=
7172
github.com/aws/aws-sdk-go v1.42.44/go.mod h1:OGr6lGMAKGlG9CVrYnWYDKIyb829c6EVBRjxqjmPepc=
7273
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
@@ -108,6 +109,7 @@ github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti
108109
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
109110
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
110111
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
112+
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
111113
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
112114
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
113115
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -165,6 +167,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
165167
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
166168
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
167169
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
170+
github.com/hashicorp/aws-sdk-go-base v1.0.0 h1:J7MMLOfSoDWkusy+cSzKYG1/aFyCzYJmdE0mod3/WLw=
171+
github.com/hashicorp/aws-sdk-go-base v1.0.0/go.mod h1:2fRjWDv3jJBeN6mVWFHV6hFTNeFBx2gpDLQaZNxUVAY=
168172
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
169173
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
170174
github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU=
@@ -237,6 +241,7 @@ github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZ
237241
github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
238242
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
239243
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
244+
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
240245
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
241246
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
242247
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
@@ -316,6 +321,7 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
316321
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
317322
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
318323
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
324+
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
319325
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
320326
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
321327
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=

scaleway/helpers.go

+11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/hashicorp/go-cty/cty"
1313
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1415
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1516
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1617
"github.com/scaleway/scaleway-sdk-go/namegenerator"
@@ -523,3 +524,13 @@ func diffSuppressFuncIgnoreCaseAndHyphen(k, old, new string, d *schema.ResourceD
523524
func diffSuppressFuncLocality(k, old, new string, d *schema.ResourceData) bool {
524525
return expandID(old) == expandID(new)
525526
}
527+
528+
// TimedOut returns true if the error represents a "wait timed out" condition.
529+
// Specifically, TimedOut returns true if the error matches all these conditions:
530+
// * err is of type resource.TimeoutError
531+
// * TimeoutError.LastError is nil
532+
func TimedOut(err error) bool {
533+
// This explicitly does *not* match wrapped TimeoutErrors
534+
timeoutErr, ok := err.(*resource.TimeoutError) //nolint:errorlint // Explicitly does *not* match wrapped TimeoutErrors
535+
return ok && timeoutErr.LastError == nil
536+
}

scaleway/helpers_object.go

+84
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package scaleway
22

33
import (
4+
"bytes"
5+
"context"
46
"errors"
57
"fmt"
8+
"hash/crc32"
69
"net/http"
710
"os"
811
"strings"
@@ -13,12 +16,15 @@ import (
1316
"github.com/aws/aws-sdk-go/aws/credentials"
1417
"github.com/aws/aws-sdk-go/aws/session"
1518
"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"
1621
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1722
"github.com/scaleway/scaleway-sdk-go/scw"
1823
)
1924

2025
const (
2126
defaultObjectBucketTimeout = 10 * time.Minute
27+
retryOnAWSAPI = 2 * time.Minute
2228
)
2329

2430
func newS3Client(httpClient *http.Client, region, accessKey, secretKey string) (*s3.S3, error) {
@@ -195,3 +201,81 @@ func expandBucketCORS(rawCors []interface{}, bucket string) []*s3.CORSRule {
195201
}
196202
return rules
197203
}
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+
}

scaleway/helpers_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,24 @@ func testCheckResourceAttrIP(name string, key string) resource.TestCheckFunc {
226226
return nil
227227
})
228228
}
229+
230+
func TestStringHashcode(t *testing.T) {
231+
v := "hello, world"
232+
expected := StringHashcode(v)
233+
for i := 0; i < 100; i++ {
234+
actual := StringHashcode(v)
235+
if actual != expected {
236+
t.Fatalf("bad: %#v\n\t%#v", actual, expected)
237+
}
238+
}
239+
}
240+
241+
func TestStringHashcode_positiveIndex(t *testing.T) {
242+
// "2338615298" hashes to uint32(2147483648) which is math.MinInt32
243+
ips := []string{"192.168.1.3", "192.168.1.5", "2338615298"}
244+
for _, ip := range ips {
245+
if index := StringHashcode(ip); index < 0 {
246+
t.Fatalf("Bad Index %#v for ip %s", index, ip)
247+
}
248+
}
249+
}

0 commit comments

Comments
 (0)