1
0
Fork 0
mirror of https://github.com/Luzifer/mondash.git synced 2024-11-09 16:10:01 +00:00
mondash/storage/s3.go

100 lines
2.2 KiB
Go
Raw Permalink Normal View History

package storage
2015-07-06 19:41:21 +00:00
import (
2015-07-06 23:01:14 +00:00
"bytes"
2015-07-06 19:41:21 +00:00
"io/ioutil"
"net/url"
"path"
2015-07-06 19:41:21 +00:00
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/session"
2015-07-06 19:41:21 +00:00
"github.com/aws/aws-sdk-go/service/s3"
)
2015-07-06 19:44:13 +00:00
// S3Storage is a storage adapter storing the data into single S3 files
2015-07-06 19:41:21 +00:00
type S3Storage struct {
s3connection *s3.S3
bucket string
prefix string
2015-07-06 19:41:21 +00:00
}
2015-07-06 19:44:13 +00:00
// NewS3Storage instanciates a new S3Storage
func NewS3Storage(uri *url.URL) *S3Storage {
s3connection := s3.New(session.Must(session.NewSession()))
2015-07-06 19:41:21 +00:00
return &S3Storage{
s3connection: s3connection,
bucket: uri.Host,
prefix: uri.Path,
2015-07-06 19:41:21 +00:00
}
}
2015-07-06 19:44:13 +00:00
// Put writes the given data to S3
2015-07-06 19:41:21 +00:00
func (s *S3Storage) Put(dashboardID string, data []byte) error {
_, err := s.s3connection.PutObject(&s3.PutObjectInput{
Bucket: aws.String(s.bucket),
2015-07-06 19:41:21 +00:00
ContentType: aws.String("application/json"),
Key: s.getKey(dashboardID),
2015-07-06 23:01:14 +00:00
Body: bytes.NewReader(data),
ACL: aws.String("private"),
2015-07-06 19:41:21 +00:00
})
return err
}
2015-07-06 19:44:13 +00:00
// Get loads the data for the given dashboard from S3
2015-07-06 19:41:21 +00:00
func (s *S3Storage) Get(dashboardID string) ([]byte, error) {
res, err := s.s3connection.GetObject(&s3.GetObjectInput{
Bucket: aws.String(s.bucket),
Key: s.getKey(dashboardID),
2015-07-06 19:41:21 +00:00
})
if err != nil {
return nil, err
}
defer res.Body.Close()
data, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}
return data, nil
}
2015-07-06 19:44:13 +00:00
// Delete deletes the given dashboard from S3
2015-07-06 19:41:21 +00:00
func (s *S3Storage) Delete(dashboardID string) error {
_, err := s.s3connection.DeleteObject(&s3.DeleteObjectInput{
Bucket: aws.String(s.bucket),
Key: s.getKey(dashboardID),
2015-07-06 19:41:21 +00:00
})
return err
}
2015-07-06 19:44:13 +00:00
// Exists checks for the existence of the given dashboard
2015-07-06 19:41:21 +00:00
func (s *S3Storage) Exists(dashboardID string) (bool, error) {
_, err := s.s3connection.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(s.bucket),
Key: s.getKey(dashboardID),
2015-07-06 19:41:21 +00:00
})
if err != nil {
if awsErr, ok := err.(awserr.Error); ok {
if strings.Contains(awsErr.Error(), "status code: 404") {
return false, nil
}
return false, err
}
2015-07-06 19:44:13 +00:00
return false, err
2015-07-06 19:41:21 +00:00
}
return true, nil
}
func (s S3Storage) getKey(dashboardID string) *string {
p := path.Join(s.prefix, dashboardID)
return aws.String(strings.TrimLeft(p, "/"))
}