From fb059a1a3ad246368d678cb11bab13037b3bf788 Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Mon, 14 Jun 2021 20:24:41 +0300 Subject: [PATCH 1/7] Add Folder.CopyObject for S3 --- azure/folder.go | 4 ++++ fs/folder.go | 4 ++++ gcs/folder.go | 4 ++++ memory/folder.go | 8 ++++++++ s3/folder.go | 17 +++++++++++++++++ sh/folder.go | 4 ++++ storage/folder.go | 2 ++ swift/folder.go | 4 ++++ 8 files changed, 47 insertions(+) diff --git a/azure/folder.go b/azure/folder.go index 30b6cce..8d81aff 100644 --- a/azure/folder.go +++ b/azure/folder.go @@ -211,6 +211,10 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + return NewFolderError(nil, "Not implemented") +} + func (folder *Folder) DeleteObjects(objectRelativePaths []string) error { for _, objectRelativePath := range objectRelativePaths { //Delete blob using blobURL obtained from full path to blob diff --git a/fs/folder.go b/fs/folder.go index 413d0c6..65f31b1 100644 --- a/fs/folder.go +++ b/fs/folder.go @@ -117,6 +117,10 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + return NewError(nil, "Not implemented") +} + func OpenFileWithDir(filePath string) (*os.File, error) { file, err := os.Create(filePath) if os.IsNotExist(err) { diff --git a/gcs/folder.go b/gcs/folder.go index 799733a..779f10b 100644 --- a/gcs/folder.go +++ b/gcs/folder.go @@ -344,6 +344,10 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + return NewError(nil, "Not implemented") +} + func (folder *Folder) joinPath(one string, another string) string { if folder.normalizePrefix { return storage.JoinPath(one, another) diff --git a/memory/folder.go b/memory/folder.go index dfec73c..08a5d1f 100644 --- a/memory/folder.go +++ b/memory/folder.go @@ -20,6 +20,10 @@ func NewFolder(path string, storage *Storage) *Folder { return &Folder{path, storage} } +func NewError(err error, format string, args ...interface{}) storage.Error { + return storage.NewError(err, "Memory", format, args...) +} + func (folder *Folder) Exists(objectRelativePath string) (bool, error) { _, exists := folder.Storage.Load(folder.path + objectRelativePath) return exists, nil @@ -81,3 +85,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { folder.Storage.Store(objectPath, *bytes.NewBuffer(data)) return nil } + +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + return NewError(nil, "Not implemented") +} \ No newline at end of file diff --git a/s3/folder.go b/s3/folder.go index 2c4c998..51e18cd 100644 --- a/s3/folder.go +++ b/s3/folder.go @@ -149,6 +149,23 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return folder.uploader.upload(*folder.Bucket, folder.Path+name, content) } +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + if exists, err := folder.Exists(objectRelativePath); !exists { + if err == nil { + return NewFolderError(nil, "object do not exists") + } else { + return err + } + } + source := *folder.Bucket+"/"+objectRelativePath + input := &s3.CopyObjectInput{CopySource: &source, Bucket: &dstBucket, Key: &dstObject} + _, err := folder.S3API.CopyObject(input) + if err != nil { + return err + } + return nil +} + func (folder *Folder) ReadObject(objectRelativePath string) (io.ReadCloser, error) { objectPath := folder.Path + objectRelativePath input := &s3.GetObjectInput{ diff --git a/sh/folder.go b/sh/folder.go index 633cc60..317e6d8 100644 --- a/sh/folder.go +++ b/sh/folder.go @@ -236,3 +236,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } + +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + return NewFolderError(nil, "Not implemented") +} \ No newline at end of file diff --git a/storage/folder.go b/storage/folder.go index aaee6d0..54c7c1b 100644 --- a/storage/folder.go +++ b/storage/folder.go @@ -26,6 +26,8 @@ type Folder interface { ReadObject(objectRelativePath string) (io.ReadCloser, error) PutObject(name string, content io.Reader) error + + CopyObject(objectRelativePath string, dstBucket string, dstObject string) error } func DeleteObjectsWhere(folder Folder, confirm bool, filter func(object1 Object) bool) error { diff --git a/swift/folder.go b/swift/folder.go index af61aaa..3a92db7 100644 --- a/swift/folder.go +++ b/swift/folder.go @@ -144,6 +144,10 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } +func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { + return NewError(nil, "Not implemented") +} + func (folder *Folder) DeleteObjects(objectRelativePaths []string) error { for _, objectRelativePath := range objectRelativePaths { path := storage.JoinPath(folder.path, objectRelativePath) From 9a9834df2f7750c52285b41fcd13335569f283c1 Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Wed, 16 Jun 2021 12:35:26 +0300 Subject: [PATCH 2/7] Revert pr45 --- s3/session.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/s3/session.go b/s3/session.go index df9d551..4c68e9a 100644 --- a/s3/session.go +++ b/s3/session.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/defaults" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/aws/session" @@ -89,6 +90,21 @@ func getDefaultConfig(settings map[string]string) *aws.Config { config := defaults.Get().Config.WithRegion(settings[RegionSetting]) config = request.WithRetryer(config, client.DefaultRetryer{NumMaxRetries: MaxRetries}) + provider := &credentials.StaticProvider{Value: credentials.Value{ + AccessKeyID: getFirstSettingOf(settings, []string{AccessKeyIdSetting, AccessKeySetting}), + SecretAccessKey: getFirstSettingOf(settings, []string{SecretAccessKeySetting, SecretKeySetting}), + SessionToken: settings[SessionTokenSetting], + }} + providers := make([]credentials.Provider, 0) + providers = append(providers, provider) + providers = append(providers, defaults.CredProviders(config, defaults.Handlers())...) + newCredentials := credentials.NewCredentials(&credentials.ChainProvider{ + VerboseErrors: aws.BoolValue(config.CredentialsChainVerboseErrors), + Providers: providers, + }) + + config = config.WithCredentials(newCredentials) + if logLevel, ok := settings[LogLevel]; ok { config = config.WithLogLevel(func(s string) aws.LogLevelType { switch s { From d1e183c20dd6905279edebe4660845df30051ce3 Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Wed, 16 Jun 2021 20:45:42 +0300 Subject: [PATCH 3/7] Fix CopyObject --- s3/folder.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/s3/folder.go b/s3/folder.go index 51e18cd..cfc00f9 100644 --- a/s3/folder.go +++ b/s3/folder.go @@ -157,7 +157,8 @@ func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, ds return err } } - source := *folder.Bucket+"/"+objectRelativePath + + source := folder.Path+"/"+objectRelativePath input := &s3.CopyObjectInput{CopySource: &source, Bucket: &dstBucket, Key: &dstObject} _, err := folder.S3API.CopyObject(input) if err != nil { From f709c4ac97aa5be655ff6723bc7c7bf045c20ac8 Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Wed, 16 Jun 2021 21:07:10 +0300 Subject: [PATCH 4/7] Remove bucket parameter from CopyObject --- azure/folder.go | 2 +- fs/folder.go | 2 +- gcs/folder.go | 2 +- memory/folder.go | 2 +- s3/folder.go | 4 ++-- sh/folder.go | 2 +- storage/folder.go | 2 +- swift/folder.go | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/azure/folder.go b/azure/folder.go index 8d81aff..b264121 100644 --- a/azure/folder.go +++ b/azure/folder.go @@ -211,7 +211,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { return NewFolderError(nil, "Not implemented") } diff --git a/fs/folder.go b/fs/folder.go index 65f31b1..9a6d14c 100644 --- a/fs/folder.go +++ b/fs/folder.go @@ -117,7 +117,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } diff --git a/gcs/folder.go b/gcs/folder.go index 779f10b..53c5b50 100644 --- a/gcs/folder.go +++ b/gcs/folder.go @@ -344,7 +344,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } diff --git a/memory/folder.go b/memory/folder.go index 08a5d1f..c64729c 100644 --- a/memory/folder.go +++ b/memory/folder.go @@ -86,6 +86,6 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } \ No newline at end of file diff --git a/s3/folder.go b/s3/folder.go index cfc00f9..9a8cfd5 100644 --- a/s3/folder.go +++ b/s3/folder.go @@ -149,7 +149,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return folder.uploader.upload(*folder.Bucket, folder.Path+name, content) } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { if exists, err := folder.Exists(objectRelativePath); !exists { if err == nil { return NewFolderError(nil, "object do not exists") @@ -159,7 +159,7 @@ func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, ds } source := folder.Path+"/"+objectRelativePath - input := &s3.CopyObjectInput{CopySource: &source, Bucket: &dstBucket, Key: &dstObject} + input := &s3.CopyObjectInput{CopySource: &source, Bucket: folder.Bucket, Key: &dstObject} _, err := folder.S3API.CopyObject(input) if err != nil { return err diff --git a/sh/folder.go b/sh/folder.go index 317e6d8..f336156 100644 --- a/sh/folder.go +++ b/sh/folder.go @@ -237,6 +237,6 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { return NewFolderError(nil, "Not implemented") } \ No newline at end of file diff --git a/storage/folder.go b/storage/folder.go index 54c7c1b..8f3a7e3 100644 --- a/storage/folder.go +++ b/storage/folder.go @@ -27,7 +27,7 @@ type Folder interface { PutObject(name string, content io.Reader) error - CopyObject(objectRelativePath string, dstBucket string, dstObject string) error + CopyObject(objectRelativePath string, dstObject string) error } func DeleteObjectsWhere(folder Folder, confirm bool, filter func(object1 Object) bool) error { diff --git a/swift/folder.go b/swift/folder.go index 3a92db7..9edc1e7 100644 --- a/swift/folder.go +++ b/swift/folder.go @@ -144,7 +144,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstBucket string, dstObject string) error { +func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } From c6bf648ab0d1f5f0daec24aff6b11e3928cdc66c Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Sun, 20 Jun 2021 14:06:52 +0300 Subject: [PATCH 5/7] S3 CopyObject change source path --- s3/folder.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/s3/folder.go b/s3/folder.go index 9a8cfd5..dc154ed 100644 --- a/s3/folder.go +++ b/s3/folder.go @@ -157,8 +157,7 @@ func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) er return err } } - - source := folder.Path+"/"+objectRelativePath + source := *folder.Bucket + objectRelativePath input := &s3.CopyObjectInput{CopySource: &source, Bucket: folder.Bucket, Key: &dstObject} _, err := folder.S3API.CopyObject(input) if err != nil { From 7dfa3e17b3ceb0740d086de3088f6589ceb69800 Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Sun, 20 Jun 2021 14:31:23 +0300 Subject: [PATCH 6/7] S3 CopyObject check source existence --- s3/folder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/s3/folder.go b/s3/folder.go index dc154ed..0c1f546 100644 --- a/s3/folder.go +++ b/s3/folder.go @@ -150,14 +150,14 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { } func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { - if exists, err := folder.Exists(objectRelativePath); !exists { + source := *folder.Bucket + objectRelativePath + if exists, err := folder.Exists(source); !exists { if err == nil { return NewFolderError(nil, "object do not exists") } else { return err } } - source := *folder.Bucket + objectRelativePath input := &s3.CopyObjectInput{CopySource: &source, Bucket: folder.Bucket, Key: &dstObject} _, err := folder.S3API.CopyObject(input) if err != nil { From 9d9db9f94d3e54539119216bd16d89648b49cb6e Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Thu, 24 Jun 2021 03:01:07 +0300 Subject: [PATCH 7/7] Fix CopyObject --- azure/folder.go | 2 +- fs/folder.go | 2 +- gcs/folder.go | 2 +- memory/folder.go | 2 +- s3/folder.go | 9 +++++---- sh/folder.go | 2 +- storage/folder.go | 2 +- swift/folder.go | 2 +- 8 files changed, 12 insertions(+), 11 deletions(-) diff --git a/azure/folder.go b/azure/folder.go index b264121..47ea7af 100644 --- a/azure/folder.go +++ b/azure/folder.go @@ -211,7 +211,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { return NewFolderError(nil, "Not implemented") } diff --git a/fs/folder.go b/fs/folder.go index 9a6d14c..486c8b3 100644 --- a/fs/folder.go +++ b/fs/folder.go @@ -117,7 +117,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } diff --git a/gcs/folder.go b/gcs/folder.go index 53c5b50..e726a41 100644 --- a/gcs/folder.go +++ b/gcs/folder.go @@ -344,7 +344,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } diff --git a/memory/folder.go b/memory/folder.go index c64729c..02b15fb 100644 --- a/memory/folder.go +++ b/memory/folder.go @@ -86,6 +86,6 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") } \ No newline at end of file diff --git a/s3/folder.go b/s3/folder.go index 0c1f546..c0a63c7 100644 --- a/s3/folder.go +++ b/s3/folder.go @@ -149,16 +149,17 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return folder.uploader.upload(*folder.Bucket, folder.Path+name, content) } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { - source := *folder.Bucket + objectRelativePath - if exists, err := folder.Exists(source); !exists { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { + if exists, err := folder.Exists(objectRelativePath); !exists { if err == nil { return NewFolderError(nil, "object do not exists") } else { return err } } - input := &s3.CopyObjectInput{CopySource: &source, Bucket: folder.Bucket, Key: &dstObject} + source := *folder.Bucket + "/" + baseBackupPath + objectRelativePath + dst := baseBackupPath + dstObject + input := &s3.CopyObjectInput{CopySource: &source, Bucket: folder.Bucket, Key: &dst} _, err := folder.S3API.CopyObject(input) if err != nil { return err diff --git a/sh/folder.go b/sh/folder.go index f336156..67bb41a 100644 --- a/sh/folder.go +++ b/sh/folder.go @@ -237,6 +237,6 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { return NewFolderError(nil, "Not implemented") } \ No newline at end of file diff --git a/storage/folder.go b/storage/folder.go index 8f3a7e3..c318279 100644 --- a/storage/folder.go +++ b/storage/folder.go @@ -27,7 +27,7 @@ type Folder interface { PutObject(name string, content io.Reader) error - CopyObject(objectRelativePath string, dstObject string) error + CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error } func DeleteObjectsWhere(folder Folder, confirm bool, filter func(object1 Object) bool) error { diff --git a/swift/folder.go b/swift/folder.go index 9edc1e7..cfc7097 100644 --- a/swift/folder.go +++ b/swift/folder.go @@ -144,7 +144,7 @@ func (folder *Folder) PutObject(name string, content io.Reader) error { return nil } -func (folder *Folder) CopyObject(objectRelativePath string, dstObject string) error { +func (folder *Folder) CopyObject(baseBackupPath string, objectRelativePath string, dstObject string) error { return NewError(nil, "Not implemented") }