forked from argoproj/argo-events
-
Notifications
You must be signed in to change notification settings - Fork 0
/
s3.go
80 lines (69 loc) · 2.23 KB
/
s3.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
80
/*
Copyright 2018 BlackRock, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package store
import (
"fmt"
"io/ioutil"
apicommon "github.com/argoproj/argo-events/pkg/apis/common"
"github.com/minio/minio-go"
log "github.com/sirupsen/logrus"
)
// S3Reader implements the ArtifactReader interface and allows reading artifacts from S3 compatible API store
type S3Reader struct {
client *minio.Client
s3 *apicommon.S3Artifact
creds *Credentials
}
// NewS3Reader creates a new ArtifactReader for an S3 compatible store
func NewS3Reader(s3 *apicommon.S3Artifact, creds *Credentials) (ArtifactReader, error) {
client, err := NewMinioClient(s3, *creds)
if err != nil {
return nil, err
}
return &S3Reader{
client: client,
s3: s3,
creds: creds,
}, nil
}
func (reader *S3Reader) Read() ([]byte, error) {
log.Debugf("reading s3Artifact from %s/%s", reader.s3.Bucket.Name, reader.s3.Bucket.Key)
obj, err := reader.client.GetObject(reader.s3.Bucket.Name, reader.s3.Bucket.Key, minio.GetObjectOptions{})
if err != nil {
return nil, err
}
defer func() {
if err := obj.Close(); err != nil {
fmt.Printf("failed to close object. err: %+v", err)
}
}()
b, err := ioutil.ReadAll(obj)
if err != nil {
return nil, err
}
return b, nil
}
// NewMinioClient instantiates a new minio client object to access s3 compatible APIs
func NewMinioClient(s3 *apicommon.S3Artifact, creds Credentials) (*minio.Client, error) {
var minioClient *minio.Client
var err error
if s3.Region != "" {
minioClient, err = minio.NewWithRegion(s3.Endpoint, creds.accessKey, creds.secretKey, !s3.Insecure, s3.Region)
} else {
minioClient, err = minio.New(s3.Endpoint, creds.accessKey, creds.secretKey, !s3.Insecure)
}
if err != nil {
return nil, err
}
return minioClient, nil
}