Added GCS support #8370

This commit is contained in:
Konstantin Chukhlomin
2017-09-15 16:11:02 +02:00
committed by bergquist
parent 93cff1a42a
commit 72d7c4d620
34 changed files with 4429 additions and 8 deletions
+56
View File
@@ -0,0 +1,56 @@
package imguploader
import (
"github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/util"
"google.golang.org/api/option"
"cloud.google.com/go/storage"
"golang.org/x/net/context"
"io/ioutil"
"fmt"
)
type GCPUploader struct {
keyFile string
bucket string
log log.Logger
}
func NewGCPUploader(keyFile, bucket string) *GCPUploader {
return &GCPUploader{
keyFile: keyFile,
bucket: bucket,
log: log.New("gcpuploader"),
}
}
func (u *GCPUploader) Upload(imageDiskPath string) (string, error) {
ctx := context.Background()
client, err := storage.NewClient(ctx, option.WithServiceAccountFile(u.keyFile))
if err != nil {
return "", err
}
key := util.GetRandomString(20) + ".png"
log.Debug("Uploading image to GCP bucket = %s key = %s", u.bucket, key)
file, err := ioutil.ReadFile(imageDiskPath)
if err != nil {
return "", err
}
wc := client.Bucket(u.bucket).Object(key).NewWriter(ctx)
wc.ContentType = "image/png"
wc.ACL = []storage.ACLRule{{Entity: storage.AllUsers, Role: storage.RoleReader}}
if _, err := wc.Write(file); err != nil {
return "", err
}
if err := wc.Close(); err != nil {
return "", err
}
return fmt.Sprintf("https://storage.googleapis.com/%s/%s", u.bucket, key), nil
}
@@ -0,0 +1,23 @@
package imguploader
import (
"testing"
"github.com/grafana/grafana/pkg/setting"
. "github.com/smartystreets/goconvey/convey"
)
func TestUploadToGCP(t *testing.T) {
SkipConvey("[Integration test] for external_image_store.gcp", t, func() {
setting.NewConfigContext(&setting.CommandLineArgs{
HomePath: "../../../",
})
gcpUploader, _ := NewImageUploader()
path, err := gcpUploader.Upload("../../../public/img/logo_transparent_400x.png")
So(err, ShouldBeNil)
So(path, ShouldNotEqual, "")
})
}
+10
View File
@@ -52,6 +52,16 @@ func NewImageUploader() (ImageUploader, error) {
password := webdavSec.Key("password").String()
return NewWebdavImageUploader(url, username, password, public_url)
case "gcp":
gcpsec, err := setting.Cfg.GetSection("external_image_storage.gcp")
if err != nil {
return nil, err
}
keyFile := gcpsec.Key("key_file").MustString("")
bucketName := gcpsec.Key("bucket").MustString("")
return NewGCPUploader(keyFile, bucketName), nil
}
return NopImageUploader{}, nil
@@ -96,5 +96,28 @@ func TestImageUploaderFactory(t *testing.T) {
So(original.username, ShouldEqual, "username")
So(original.password, ShouldEqual, "password")
})
Convey("GCP uploader", func() {
var err error
setting.NewConfigContext(&setting.CommandLineArgs{
HomePath: "../../../",
})
setting.ImageUploadProvider = "gcp"
gcpSec, err := setting.Cfg.GetSection("external_image_storage.gcp")
gcpSec.NewKey("key_file", "/etc/secrets/project-79a52befa3f6.json")
gcpSec.NewKey("bucket", "project-grafana-east")
uploader, err := NewImageUploader()
So(err, ShouldBeNil)
original, ok := uploader.(*GCPUploader)
So(ok, ShouldBeTrue)
So(original.keyFile, ShouldEqual, "/etc/secrets/project-79a52befa3f6.json")
So(original.bucket, ShouldEqual, "project-grafana-east")
})
})
}