Added GCS support #8370
This commit is contained in:
committed by
bergquist
parent
93cff1a42a
commit
72d7c4d620
@@ -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, "")
|
||||
})
|
||||
}
|
||||
@@ -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")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user