/
s3.go
56 lines (42 loc) · 1.15 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
// +build go1.13
package main
import (
"bytes"
"context"
"fmt"
"github.com/pkg/errors"
"github.com/thomersch/grandine/lib/tile"
minio "github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
const S3ProtoPrefix = "s3://"
type s3Client struct {
*minio.Client
bucket string
}
type S3TileWriter struct {
client s3Client
}
func NewS3TileWriter(endpoint, bucket, accessKeyID, secretAccessKey string) (*S3TileWriter, error) {
s3tw := &S3TileWriter{}
client, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
})
if err != nil {
return nil, err
}
ok, err := client.BucketExists(context.Background(), bucket)
if err != nil {
return nil, err
}
if !ok {
return nil, fmt.Errorf("S3 bucket %s does not exist", bucket)
}
s3tw.client = s3Client{client, bucket}
return s3tw, nil
}
func (s3 *S3TileWriter) WriteTile(tID tile.ID, buf []byte, ext string) error {
r := bytes.NewReader(buf)
_, err := s3.client.PutObject(context.Background(), s3.client.bucket, tID.String()+"."+ext, r, int64(r.Len()), minio.PutObjectOptions{})
return errors.Wrap(err, "S3 upload failed")
}