add S3ForcePathStyle support for s3 binding (#1360)

* add S3ForcePathStyle support for s3 binding

Signed-off-by: rainfd <rainfd@live.cn>

* add S3ForcePathStyle unit test

Signed-off-by: rainfd <rainfd@live.cn>
This commit is contained in:
RainFD 2021-12-24 10:58:39 +08:00 committed by GitHub
parent 190a47cd87
commit 0f97b52b90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 15 deletions

View File

@ -42,14 +42,15 @@ type AWSS3 struct {
} }
type s3Metadata struct { type s3Metadata struct {
Region string `json:"region"` Region string `json:"region"`
Endpoint string `json:"endpoint"` Endpoint string `json:"endpoint"`
AccessKey string `json:"accessKey"` AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"` SecretKey string `json:"secretKey"`
SessionToken string `json:"sessionToken"` SessionToken string `json:"sessionToken"`
Bucket string `json:"bucket"` Bucket string `json:"bucket"`
DecodeBase64 bool `json:"decodeBase64,string"` DecodeBase64 bool `json:"decodeBase64,string"`
EncodeBase64 bool `json:"encodeBase64,string"` EncodeBase64 bool `json:"encodeBase64,string"`
ForcePathStyle bool `json:"forcePathStyle,string"`
} }
type createResponse struct { type createResponse struct {
@ -79,10 +80,13 @@ func (s *AWSS3) Init(metadata bindings.Metadata) error {
if err != nil { if err != nil {
return err return err
} }
cfg := aws.NewConfig().WithS3ForcePathStyle(m.ForcePathStyle)
s.metadata = m s.metadata = m
s.s3Client = s3.New(session) s.s3Client = s3.New(session, cfg)
s.downloader = s3manager.NewDownloader(session) s.downloader = s3manager.NewDownloaderWithClient(s.s3Client)
s.uploader = s3manager.NewUploader(session) s.uploader = s3manager.NewUploaderWithClient(s.s3Client)
return nil return nil
} }

View File

@ -18,7 +18,7 @@ func TestParseMetadata(t *testing.T) {
t.Run("Has correct metadata", func(t *testing.T) { t.Run("Has correct metadata", func(t *testing.T) {
m := bindings.Metadata{} m := bindings.Metadata{}
m.Properties = map[string]string{ m.Properties = map[string]string{
"AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "ForcePathStyle": "true",
} }
s3 := AWSS3{} s3 := AWSS3{}
meta, err := s3.parseMetadata(m) meta, err := s3.parseMetadata(m)
@ -29,6 +29,7 @@ func TestParseMetadata(t *testing.T) {
assert.Equal(t, "test", meta.Bucket) assert.Equal(t, "test", meta.Bucket)
assert.Equal(t, "endpoint", meta.Endpoint) assert.Equal(t, "endpoint", meta.Endpoint)
assert.Equal(t, "token", meta.SessionToken) assert.Equal(t, "token", meta.SessionToken)
assert.Equal(t, true, meta.ForcePathStyle)
}) })
} }
@ -36,7 +37,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
t.Run("Has merged metadata", func(t *testing.T) { t.Run("Has merged metadata", func(t *testing.T) {
m := bindings.Metadata{} m := bindings.Metadata{}
m.Properties = map[string]string{ m.Properties = map[string]string{
"AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "ForcePathStyle": "true",
} }
s3 := AWSS3{} s3 := AWSS3{}
meta, err := s3.parseMetadata(m) meta, err := s3.parseMetadata(m)
@ -47,6 +48,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
assert.Equal(t, "test", meta.Bucket) assert.Equal(t, "test", meta.Bucket)
assert.Equal(t, "endpoint", meta.Endpoint) assert.Equal(t, "endpoint", meta.Endpoint)
assert.Equal(t, "token", meta.SessionToken) assert.Equal(t, "token", meta.SessionToken)
assert.Equal(t, true, meta.ForcePathStyle)
request := bindings.InvokeRequest{} request := bindings.InvokeRequest{}
request.Metadata = map[string]string{ request.Metadata = map[string]string{
@ -65,6 +67,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
assert.Equal(t, "test", mergedMeta.Bucket) assert.Equal(t, "test", mergedMeta.Bucket)
assert.Equal(t, "endpoint", mergedMeta.Endpoint) assert.Equal(t, "endpoint", mergedMeta.Endpoint)
assert.Equal(t, "token", mergedMeta.SessionToken) assert.Equal(t, "token", mergedMeta.SessionToken)
assert.Equal(t, true, meta.ForcePathStyle)
assert.Equal(t, true, mergedMeta.DecodeBase64) assert.Equal(t, true, mergedMeta.DecodeBase64)
assert.Equal(t, false, mergedMeta.EncodeBase64) assert.Equal(t, false, mergedMeta.EncodeBase64)
}) })
@ -72,7 +75,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
t.Run("Has invalid merged metadata decodeBase64", func(t *testing.T) { t.Run("Has invalid merged metadata decodeBase64", func(t *testing.T) {
m := bindings.Metadata{} m := bindings.Metadata{}
m.Properties = map[string]string{ m.Properties = map[string]string{
"AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "ForcePathStyle": "true",
} }
s3 := AWSS3{} s3 := AWSS3{}
meta, err := s3.parseMetadata(m) meta, err := s3.parseMetadata(m)
@ -83,6 +86,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
assert.Equal(t, "test", meta.Bucket) assert.Equal(t, "test", meta.Bucket)
assert.Equal(t, "endpoint", meta.Endpoint) assert.Equal(t, "endpoint", meta.Endpoint)
assert.Equal(t, "token", meta.SessionToken) assert.Equal(t, "token", meta.SessionToken)
assert.Equal(t, true, meta.ForcePathStyle)
request := bindings.InvokeRequest{} request := bindings.InvokeRequest{}
request.Metadata = map[string]string{ request.Metadata = map[string]string{
@ -98,7 +102,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
t.Run("Has invalid merged metadata encodeBase64", func(t *testing.T) { t.Run("Has invalid merged metadata encodeBase64", func(t *testing.T) {
m := bindings.Metadata{} m := bindings.Metadata{}
m.Properties = map[string]string{ m.Properties = map[string]string{
"AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "AccessKey": "key", "Region": "region", "SecretKey": "secret", "Bucket": "test", "Endpoint": "endpoint", "SessionToken": "token", "ForcePathStyle": "true",
} }
s3 := AWSS3{} s3 := AWSS3{}
meta, err := s3.parseMetadata(m) meta, err := s3.parseMetadata(m)
@ -109,6 +113,7 @@ func TestMergeWithRequestMetadata(t *testing.T) {
assert.Equal(t, "test", meta.Bucket) assert.Equal(t, "test", meta.Bucket)
assert.Equal(t, "endpoint", meta.Endpoint) assert.Equal(t, "endpoint", meta.Endpoint)
assert.Equal(t, "token", meta.SessionToken) assert.Equal(t, "token", meta.SessionToken)
assert.Equal(t, true, meta.ForcePathStyle)
request := bindings.InvokeRequest{} request := bindings.InvokeRequest{}
request.Metadata = map[string]string{ request.Metadata = map[string]string{