/
upload.go
79 lines (63 loc) · 1.89 KB
/
upload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package transfer
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
myAws "github.com/halprin/cloud-backup-go/aws"
"github.com/halprin/cloud-backup-go/aws/myS3Manager"
"github.com/halprin/cloud-backup-go/config"
"io"
"path"
"sync"
)
type uploader struct {
pipeWriter *io.PipeWriter
pipeReader *io.PipeReader
s3Uploader *myS3Manager.Uploader
uploadInput *s3manager.UploadInput
waitGroup sync.WaitGroup
}
func NewUploader(fileConfig config.BackupFileConfiguration, overallConfig config.BackupConfiguration, overallFolderName string) (*uploader, error) {
pipeReader, pipeWriter := io.Pipe()
s3Uploader, err := getUploader(overallConfig)
if err != nil {
return nil, err
}
uploadInput := &s3manager.UploadInput{
Bucket: &overallConfig.S3Bucket,
Key: aws.String(path.Join(overallFolderName, fileConfig.Title + ".cipher")),
Body: pipeReader,
}
newUploader := &uploader{
pipeWriter: pipeWriter,
pipeReader: pipeReader,
s3Uploader: s3Uploader,
uploadInput: uploadInput,
waitGroup: sync.WaitGroup{},
}
newUploader.waitGroup.Add(1)
go newUploader.initiateUpload()
return newUploader, nil
}
func (receiver *uploader) Write(inputBytes []byte) (int, error) {
return receiver.pipeWriter.Write(inputBytes)
}
func (receiver *uploader) Close() error {
err := receiver.pipeWriter.Close()
receiver.waitGroup.Wait()
return err
}
func (receiver *uploader) initiateUpload() {
err := receiver.s3Uploader.Upload(receiver.uploadInput)
if err != nil {
_ = receiver.pipeReader.CloseWithError(err)
}
receiver.waitGroup.Done()
}
func getUploader(overallConfig config.BackupConfiguration) (*myS3Manager.Uploader, error) {
awsSession, err := myAws.GetSession(overallConfig.AwsCredentialConfigPath, overallConfig.AwsProfile)
if err != nil {
return nil, err
}
newUploader := myS3Manager.NewUploader(awsSession)
return newUploader, nil
}