diff --git a/engine/engine.go b/engine/engine.go index 369c477..3f7e6ae 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -19,6 +19,19 @@ type Config struct { Excludes []string `yaml:"excludes"` } +func (c *Config) buildRemoteExcludes() []string { + return c.buildExcludes(c.SaveRoot) +} + +func (c *Config) buildExcludes(root string) []string { + rets := make([]string, 0) + for _, exclude := range c.Excludes { + rets = append(rets, filepath.Join(root, exclude)) + } + + return c.Excludes +} + // Engine provides the core logic to finish the feature type Engine struct { echo @@ -43,7 +56,10 @@ func (e *Engine) TailRun(paths ...string) { log.Fatalln(err) } - if stat.IsDir() { + if stat.IsDir() && e.conf.ForceSync { + e.syncTo(path) + continue + } else if stat.IsDir() { e.uploadDirectory(path) continue } @@ -52,23 +68,30 @@ func (e *Engine) TailRun(paths ...string) { } } -func (e *Engine) uploadDirectory(dirPath string) { - objects, err := e.loadLocalObjects(dirPath) +func (e *Engine) syncTo(dirPath string) { + localObjects, err := e.loadLocalObjects(dirPath) if err != nil { log.Fatalln(err) } - // directory sync - if e.conf.ForceSync { - s := NewSyncer(e.uploader) - if err := s.Sync(objects, e.conf.SaveRoot); err != nil { - log.Fatalln(err) - } - return + remoteObjects, err := e.uploader.ListObjects(e.conf.SaveRoot) + if err != nil { + log.Fatalln(err) + } + + s := NewSyncer(e.uploader, e.conf, dirPath) + if err := s.Sync(localObjects, remoteObjects); err != nil { + log.Fatalln(err) + } +} + +func (e *Engine) uploadDirectory(dirPath string) { + localObjects, err := e.loadLocalObjects(dirPath) + if err != nil { + log.Fatalln(err) } - // directory normal upload - for _, obj := range objects { + for _, obj := range localObjects { e.uploadFile(obj.FilePath, obj.Key) } } @@ -93,7 +116,7 @@ func (e *Engine) loadLocalObjects(dirPath string) ([]uploader.Object, error) { return err } - if info.IsDir() || e.shouldExclude(dirPath, filePath) { + if info.IsDir() { return nil } @@ -113,10 +136,9 @@ func (e *Engine) loadLocalObjects(dirPath string) ([]uploader.Object, error) { return localObjects, nil } -func (e *Engine) shouldExclude(dirPath, filePath string) bool { - parentPath := strings.TrimPrefix(dirPath, "./") - for _, ePath := range e.conf.Excludes { - if strings.HasPrefix(filePath, parentPath+strings.TrimPrefix(ePath, "/")) { +func shouldExclude(filepath string, excludes []string) bool { + for _, ePath := range excludes { + if strings.HasPrefix(filepath, ePath) { return true } } diff --git a/engine/syncer.go b/engine/syncer.go index 776f41a..a6e0a39 100644 --- a/engine/syncer.go +++ b/engine/syncer.go @@ -9,16 +9,20 @@ import ( // Syncer is the syncer to finish the logic type Syncer struct { - uploader uploader.Driver + uploader uploader.Driver + config Config + localRoot string tobeUploadedObjects []uploader.Object tobeDeletedObjects []uploader.Object } // NewSyncer returns a new syncer. -func NewSyncer(uploadDriver uploader.Driver) *Syncer { +func NewSyncer(uploadDriver uploader.Driver, conf Config, localRoot string) *Syncer { return &Syncer{ - uploader: uploadDriver, + uploader: uploadDriver, + config: conf, + localRoot: localRoot, tobeUploadedObjects: make([]uploader.Object, 0), tobeDeletedObjects: make([]uploader.Object, 0), @@ -27,11 +31,7 @@ func NewSyncer(uploadDriver uploader.Driver) *Syncer { // Sync uploads the to be upload objects to the cloud // and delete the not exist remote objects -func (s *Syncer) Sync(localObjects []uploader.Object, saveRoot string) error { - remoteObjects, err := s.uploader.ListObjects(saveRoot) - if err != nil { - return err - } +func (s *Syncer) Sync(localObjects, remoteObjects []uploader.Object) error { log.Printf("find %d local objects", len(localObjects)) log.Printf("find %d remote objects", len(remoteObjects)) log.Printf("compare the local files and the remote objects...") @@ -60,6 +60,11 @@ func (s *Syncer) Sync(localObjects []uploader.Object, saveRoot string) error { // compareObjects compare local files with the remote objects func (s *Syncer) compareObjects(localObjects, remoteObjects []uploader.Object) { for _, localObject := range localObjects { + cleanLocalRoot := strings.TrimPrefix(s.localRoot, "./") + if shouldExclude(localObject.FilePath, s.config.buildExcludes(cleanLocalRoot)) { + continue + } + if !s.objectExist(localObject, remoteObjects) { localObject.Type = uploader.LocalObjectTypeAdded s.tobeUploadedObjects = append(s.tobeUploadedObjects, localObject) // the added objects @@ -73,7 +78,8 @@ func (s *Syncer) compareObjects(localObjects, remoteObjects []uploader.Object) { // find the deleted objects for _, remoteObject := range remoteObjects { - if s.objectExist(remoteObject, localObjects) { + if s.objectExist(remoteObject, localObjects) || + shouldExclude(remoteObject.FilePath, s.config.buildRemoteExcludes()) { continue } diff --git a/engine/syncer_test.go b/engine/syncer_test.go index 83dee97..1717065 100644 --- a/engine/syncer_test.go +++ b/engine/syncer_test.go @@ -3,7 +3,7 @@ package engine import ( "crypto/md5" "encoding/hex" - "fmt" + "path/filepath" "testing" "github.com/stretchr/testify/assert" @@ -13,43 +13,35 @@ import ( func TestSync(t *testing.T) { // init test data - files := map[string]string{ - "abc1.txt": "abcabc", - "abc2.txt": "112233", - "abc3.txt": "445566", + cfg := Config{SaveRoot: "/test/", Excludes: []string{"./abc"}} + e := New(cfg, &mockUploader{}) + localObjects, err := e.loadLocalObjects("./testdata") + assert.NoError(t, err) + + // test + syncer := NewSyncer(&mockUploader{}, cfg, "./testdata") + assert.NoError(t, syncer.Sync(localObjects, mockRemoteObjects(cfg.SaveRoot))) +} + +func mockRemoteObjects(remoteRoot string) []uploader.Object { + remoteFiles := map[string]string{ + "./abc/abc1.txt": "abcabc", + "./aaa/abc2.txt": "112233", + "./bbb/abc3.txt": "445566", + "./testdata/abc/a1.txt": "445566", + "./testdata/abc/a2.txt": "445566", } - localObjects := make([]uploader.Object, 0) - for name, content := range files { + remoteObjects := make([]uploader.Object, 0) + for name, content := range remoteFiles { hash := md5.Sum([]byte(content)) - localObjects = append(localObjects, uploader.Object{ - Key: name, + remoteObjects = append(remoteObjects, uploader.Object{ + Key: filepath.Join(remoteRoot, name), ETag: hex.EncodeToString(hash[:]), FilePath: name, Type: "text/plain", }) } - // test - syncer := NewSyncer(&mockUploader{}) - assert.NoError(t, syncer.Sync(localObjects, "")) -} - -func TestSync2(t *testing.T) { - objects := []uploader.Object{ - { - Key: "test", - FilePath: "test", - Type: "text/plain", - }, - } - - s := NewSyncer(&mockUploader{listErr: fmt.Errorf("list error")}) - assert.Error(t, s.Sync(objects, "")) - - s = NewSyncer(&mockUploader{uploadErr: fmt.Errorf("upload error")}) - assert.Error(t, s.Sync(objects, "")) - - s = NewSyncer(&mockUploader{deleteErr: fmt.Errorf("delete error")}) - assert.Error(t, s.Sync(objects, "")) + return remoteObjects } diff --git a/engine/testdata/abc/a1.txt b/engine/testdata/abc/a1.txt new file mode 100644 index 0000000..e69de29 diff --git a/engine/testdata/abc/a2.txt b/engine/testdata/abc/a2.txt new file mode 100644 index 0000000..e69de29 diff --git a/engine/testdata/file1.txt b/engine/testdata/file1.txt new file mode 100644 index 0000000..e69de29 diff --git a/engine/testdata/file2.txt b/engine/testdata/file2.txt new file mode 100644 index 0000000..e69de29 diff --git a/engine/testdata/file3.txt b/engine/testdata/file3.txt new file mode 100644 index 0000000..e69de29 diff --git a/go.sum b/go.sum index 8894349..82ab4b9 100644 --- a/go.sum +++ b/go.sum @@ -5,14 +5,16 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/aws/aws-sdk-go v1.30.29 h1:NXNqBS9hjOCpDL8SyCyl38gZX3LLLunKOJc5E7vJ8P0= github.com/aws/aws-sdk-go v1.30.29/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -53,8 +55,10 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -65,7 +69,6 @@ github.com/manifoldco/promptui v0.7.0 h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -91,8 +94,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI= github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= @@ -125,12 +128,12 @@ golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120 h1:EZ3cVSzKOlJxAd8e8YAJ7no8nNypTxexh/YE/xW3ZEY= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -139,6 +142,7 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -149,15 +153,16 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/uploader/driver_test.go b/uploader/driver_test.go index cbd7c5e..36f02f4 100644 --- a/uploader/driver_test.go +++ b/uploader/driver_test.go @@ -40,13 +40,13 @@ var driverConfigs = []Config{ AccessKey: os.Getenv("UPLOADER_S3_AK"), SecretKey: os.Getenv("UPLOADER_S3_SK"), }, - { - Name: "google", - Region: "auto", - Bucket: "ut-uptoc", - AccessKey: os.Getenv("UPLOADER_STORAGE_AK"), - SecretKey: os.Getenv("UPLOADER_STORAGE_SK"), - }, + //{ + // Name: "google", + // Region: "auto", + // Bucket: "ut-uptoc", + // AccessKey: os.Getenv("UPLOADER_STORAGE_AK"), + // SecretKey: os.Getenv("UPLOADER_STORAGE_SK"), + //}, } func TestUploader(t *testing.T) {