Alicloudoss (#278)

* Object storage implementation for AliCloud

* linting fixes

* fixed comments and ran "go mod tidy" based on the feedback

Co-authored-by: Yaron Schneider <yaronsc@microsoft.com>
This commit is contained in:
madhugilla 2020-03-21 01:04:38 +05:30 committed by GitHub
parent 22717373ca
commit dc1e938e61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 131 additions and 0 deletions

View File

@ -0,0 +1,100 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
// ------------------------------------------------------------
package oss
import (
"bytes"
"encoding/json"
"github.com/dapr/components-contrib/bindings"
"github.com/dapr/dapr/pkg/logger"
"github.com/google/uuid"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// AliCloudOSS is a binding for an AliCloud OSS storage bucket
type AliCloudOSS struct {
metadata *ossMetadata
client *oss.Client
logger logger.Logger
}
type ossMetadata struct {
Endpoint string `json:"endpoint"`
AccessKeyID string `json:"accessKeyID"`
AccessKey string `json:"accessKey"`
Bucket string `json:"bucket"`
}
// NewAliCloudOSS returns a new instance
func NewAliCloudOSS(logger logger.Logger) *AliCloudOSS {
return &AliCloudOSS{logger: logger}
}
// Init does metadata parsing and connection creation
func (s *AliCloudOSS) Init(metadata bindings.Metadata) error {
m, err := s.parseMetadata(metadata)
if err != nil {
return err
}
client, err := s.getClient(m)
if err != nil {
return err
}
s.metadata = m
s.client = client
return nil
}
func (s *AliCloudOSS) Write(req *bindings.WriteRequest) error {
key := ""
if val, ok := req.Metadata["key"]; ok && val != "" {
key = val
} else {
key = uuid.New().String()
s.logger.Debugf("key not found. generating key %s", key)
}
//r := bytes.NewReader(req.Data)
bucket, err := s.client.Bucket(s.metadata.Bucket)
if err != nil {
return err
}
// Upload a byte array.
err = bucket.PutObject(key, bytes.NewReader(req.Data))
if err != nil {
return err
}
return err
}
func (s *AliCloudOSS) parseMetadata(metadata bindings.Metadata) (*ossMetadata, error) {
b, err := json.Marshal(metadata.Properties)
if err != nil {
return nil, err
}
var m ossMetadata
err = json.Unmarshal(b, &m)
if err != nil {
return nil, err
}
return &m, nil
}
func (s *AliCloudOSS) getClient(metadata *ossMetadata) (*oss.Client, error) {
client, err := oss.New(metadata.Endpoint, metadata.AccessKeyID, metadata.AccessKey)
if err != nil {
return nil, err
}
return client, nil
}

View File

@ -0,0 +1,25 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
// ------------------------------------------------------------
package oss
import (
"testing"
"github.com/dapr/components-contrib/bindings"
"github.com/stretchr/testify/assert"
)
func TestParseMetadata(t *testing.T) {
m := bindings.Metadata{}
m.Properties = map[string]string{"AccessKey": "key", "Endpoint": "endpoint", "AccessKeyID": "accessKeyID", "Bucket": "test"}
aliCloudOSS := AliCloudOSS{}
meta, err := aliCloudOSS.parseMetadata(m)
assert.Nil(t, err)
assert.Equal(t, "key", meta.AccessKey)
assert.Equal(t, "endpoint", meta.Endpoint)
assert.Equal(t, "accessKeyID", meta.AccessKeyID)
assert.Equal(t, "test", meta.Bucket)
}

2
go.mod
View File

@ -20,7 +20,9 @@ require (
github.com/Shopify/sarama v1.23.1
github.com/a8m/documentdb v1.2.0
github.com/aerospike/aerospike-client-go v2.7.0+incompatible
github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible
github.com/aws/aws-sdk-go v1.25.0
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b
github.com/coreos/go-oidc v2.1.0+incompatible
github.com/dapr/dapr v0.4.1-0.20200228055659-71892bc0111e

4
go.sum
View File

@ -112,6 +112,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible h1:HXvOJsZw8JT/ldxjX74Aq4H2IY4ojV/mXMDPWFitpv8=
github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@ -123,6 +125,8 @@ github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQh
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aws/aws-sdk-go v1.25.0 h1:MyXUdCesJLBvSSKYcaKeeEwxNUwUpG6/uqVYeH/Zzfo=
github.com/aws/aws-sdk-go v1.25.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=