1
0
Fork 0
mirror of https://github.com/Luzifer/mondash.git synced 2024-12-23 12:31:18 +00:00
mondash/storage/s3.go

90 lines
2.1 KiB
Go

package storage // import "github.com/Luzifer/mondash/storage"
import (
"bytes"
"io/ioutil"
"strings"
"github.com/Luzifer/mondash/config"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/s3"
)
// S3Storage is a storage adapter storing the data into single S3 files
type S3Storage struct {
s3connection *s3.S3
cfg *config.Config
}
// NewS3Storage instanciates a new S3Storage
func NewS3Storage(cfg *config.Config) *S3Storage {
s3connection := s3.New(&aws.Config{})
return &S3Storage{
s3connection: s3connection,
cfg: cfg,
}
}
// Put writes the given data to S3
func (s *S3Storage) Put(dashboardID string, data []byte) error {
_, err := s.s3connection.PutObject(&s3.PutObjectInput{
Bucket: aws.String(s.cfg.S3.Bucket),
ContentType: aws.String("application/json"),
Key: aws.String(dashboardID),
Body: bytes.NewReader(data),
ACL: aws.String("private"),
})
return err
}
// Get loads the data for the given dashboard from S3
func (s *S3Storage) Get(dashboardID string) ([]byte, error) {
res, err := s.s3connection.GetObject(&s3.GetObjectInput{
Bucket: aws.String(s.cfg.S3.Bucket),
Key: aws.String(dashboardID),
})
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
}
// Delete deletes the given dashboard from S3
func (s *S3Storage) Delete(dashboardID string) error {
_, err := s.s3connection.DeleteObject(&s3.DeleteObjectInput{
Bucket: aws.String(s.cfg.S3.Bucket),
Key: aws.String(dashboardID),
})
return err
}
// Exists checks for the existence of the given dashboard
func (s *S3Storage) Exists(dashboardID string) (bool, error) {
_, err := s.s3connection.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(s.cfg.S3.Bucket),
Key: aws.String(dashboardID),
})
if err != nil {
if awsErr, ok := err.(awserr.Error); ok {
if strings.Contains(awsErr.Error(), "status code: 404") {
return false, nil
}
return false, err
}
return false, err
}
return true, nil
}