mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 17:15:40 -06:00
parent
9b483e765b
commit
fe8d0d27d2
@ -141,9 +141,13 @@ type AsciiLine struct {
|
||||
|
||||
func (f *JSONFormatter) Format(diff diff.Diff) (result string, err error) {
|
||||
if v, ok := f.left.(map[string]interface{}); ok {
|
||||
f.formatObject(v, diff)
|
||||
if err := f.formatObject(v, diff); err != nil {
|
||||
return "", err
|
||||
}
|
||||
} else if v, ok := f.left.([]interface{}); ok {
|
||||
f.formatArray(v, diff)
|
||||
if err := f.formatArray(v, diff); err != nil {
|
||||
return "", err
|
||||
}
|
||||
} else {
|
||||
return "", fmt.Errorf("expected map[string]interface{} or []interface{}, got %T",
|
||||
f.left)
|
||||
@ -155,29 +159,43 @@ func (f *JSONFormatter) Format(diff diff.Diff) (result string, err error) {
|
||||
fmt.Printf("%v\n", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
return b.String(), nil
|
||||
}
|
||||
|
||||
func (f *JSONFormatter) formatObject(left map[string]interface{}, df diff.Diff) {
|
||||
func (f *JSONFormatter) formatObject(left map[string]interface{}, df diff.Diff) error {
|
||||
f.addLineWith(ChangeNil, "{")
|
||||
f.push("ROOT", len(left), false)
|
||||
f.processObject(left, df.Deltas())
|
||||
if err := f.processObject(left, df.Deltas()); err != nil {
|
||||
f.pop()
|
||||
return err
|
||||
}
|
||||
|
||||
f.pop()
|
||||
f.addLineWith(ChangeNil, "}")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *JSONFormatter) formatArray(left []interface{}, df diff.Diff) {
|
||||
func (f *JSONFormatter) formatArray(left []interface{}, df diff.Diff) error {
|
||||
f.addLineWith(ChangeNil, "[")
|
||||
f.push("ROOT", len(left), true)
|
||||
f.processArray(left, df.Deltas())
|
||||
if err := f.processArray(left, df.Deltas()); err != nil {
|
||||
f.pop()
|
||||
return err
|
||||
}
|
||||
|
||||
f.pop()
|
||||
f.addLineWith(ChangeNil, "]")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *JSONFormatter) processArray(array []interface{}, deltas []diff.Delta) error {
|
||||
patchedIndex := 0
|
||||
for index, value := range array {
|
||||
f.processItem(value, deltas, diff.Index(index))
|
||||
if err := f.processItem(value, deltas, diff.Index(index)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
patchedIndex++
|
||||
}
|
||||
|
||||
@ -201,7 +219,9 @@ func (f *JSONFormatter) processObject(object map[string]interface{}, deltas []di
|
||||
names := sortKeys(object)
|
||||
for _, name := range names {
|
||||
value := object[name]
|
||||
f.processItem(value, deltas, diff.Name(name))
|
||||
if err := f.processItem(value, deltas, diff.Name(name)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Added
|
||||
@ -236,7 +256,11 @@ func (f *JSONFormatter) processItem(value interface{}, deltas []diff.Delta, posi
|
||||
f.print("{")
|
||||
f.closeLine()
|
||||
f.push(positionStr, len(o), false)
|
||||
f.processObject(o, matchedDelta.Deltas)
|
||||
if err := f.processObject(o, matchedDelta.Deltas); err != nil {
|
||||
f.pop()
|
||||
return err
|
||||
}
|
||||
|
||||
f.pop()
|
||||
f.newLine(ChangeNil)
|
||||
f.print("}")
|
||||
@ -257,7 +281,11 @@ func (f *JSONFormatter) processItem(value interface{}, deltas []diff.Delta, posi
|
||||
f.print("[")
|
||||
f.closeLine()
|
||||
f.push(positionStr, len(a), true)
|
||||
f.processArray(a, matchedDelta.Deltas)
|
||||
if err := f.processArray(a, matchedDelta.Deltas); err != nil {
|
||||
f.pop()
|
||||
return err
|
||||
}
|
||||
|
||||
f.pop()
|
||||
f.newLine(ChangeNil)
|
||||
f.print("]")
|
||||
|
@ -162,7 +162,9 @@ func (c *StorageClient) FileUpload(container, blobName string, body io.Reader) (
|
||||
extension := strings.ToLower(path.Ext(blobName))
|
||||
contentType := mime.TypeByExtension(extension)
|
||||
buf := new(bytes.Buffer)
|
||||
buf.ReadFrom(body)
|
||||
if _, err := buf.ReadFrom(body); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req, err := http.NewRequest(
|
||||
"PUT",
|
||||
c.absUrl("%s/%s", container, blobName),
|
||||
@ -181,7 +183,9 @@ func (c *StorageClient) FileUpload(container, blobName string, body io.Reader) (
|
||||
"Content-Length": strconv.Itoa(buf.Len()),
|
||||
})
|
||||
|
||||
c.Auth.SignRequest(req)
|
||||
if err := c.Auth.SignRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return c.transport().RoundTrip(req)
|
||||
}
|
||||
@ -201,7 +205,7 @@ type Auth struct {
|
||||
Key string
|
||||
}
|
||||
|
||||
func (a *Auth) SignRequest(req *http.Request) {
|
||||
func (a *Auth) SignRequest(req *http.Request) error {
|
||||
strToSign := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s",
|
||||
strings.ToUpper(req.Method),
|
||||
tryget(req.Header, "Content-Encoding"),
|
||||
@ -221,13 +225,17 @@ func (a *Auth) SignRequest(req *http.Request) {
|
||||
decodedKey, _ := base64.StdEncoding.DecodeString(a.Key)
|
||||
|
||||
sha256 := hmac.New(sha256.New, decodedKey)
|
||||
sha256.Write([]byte(strToSign))
|
||||
if _, err := sha256.Write([]byte(strToSign)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
signature := base64.StdEncoding.EncodeToString(sha256.Sum(nil))
|
||||
|
||||
copyHeadersToRequest(req, map[string]string{
|
||||
"Authorization": fmt.Sprintf("SharedKey %s:%s", a.Account, signature),
|
||||
})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func tryget(headers map[string][]string, key string) string {
|
||||
|
@ -11,9 +11,10 @@ import (
|
||||
func TestUploadToGCS(t *testing.T) {
|
||||
SkipConvey("[Integration test] for external_image_store.gcs", t, func() {
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
gcsUploader, _ := NewImageUploader()
|
||||
|
||||
|
@ -12,24 +12,27 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
Convey("Can create image uploader for ", t, func() {
|
||||
Convey("S3ImageUploader config", func() {
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
setting.ImageUploadProvider = "s3"
|
||||
|
||||
Convey("with bucket url https://foo.bar.baz.s3-us-east-2.amazonaws.com", func() {
|
||||
s3sec, err := setting.Raw.GetSection("external_image_storage.s3")
|
||||
So(err, ShouldBeNil)
|
||||
s3sec.NewKey("bucket_url", "https://foo.bar.baz.s3-us-east-2.amazonaws.com")
|
||||
s3sec.NewKey("access_key", "access_key")
|
||||
s3sec.NewKey("secret_key", "secret_key")
|
||||
_, err = s3sec.NewKey("bucket_url", "https://foo.bar.baz.s3-us-east-2.amazonaws.com")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = s3sec.NewKey("access_key", "access_key")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = s3sec.NewKey("secret_key", "secret_key")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
|
||||
So(err, ShouldBeNil)
|
||||
original, ok := uploader.(*S3Uploader)
|
||||
|
||||
original, ok := uploader.(*S3Uploader)
|
||||
So(ok, ShouldBeTrue)
|
||||
So(original.region, ShouldEqual, "us-east-2")
|
||||
So(original.bucket, ShouldEqual, "foo.bar.baz")
|
||||
@ -40,15 +43,17 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
Convey("with bucket url https://s3.amazonaws.com/mybucket", func() {
|
||||
s3sec, err := setting.Raw.GetSection("external_image_storage.s3")
|
||||
So(err, ShouldBeNil)
|
||||
s3sec.NewKey("bucket_url", "https://s3.amazonaws.com/my.bucket.com")
|
||||
s3sec.NewKey("access_key", "access_key")
|
||||
s3sec.NewKey("secret_key", "secret_key")
|
||||
_, err = s3sec.NewKey("bucket_url", "https://s3.amazonaws.com/my.bucket.com")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = s3sec.NewKey("access_key", "access_key")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = s3sec.NewKey("secret_key", "secret_key")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
|
||||
So(err, ShouldBeNil)
|
||||
original, ok := uploader.(*S3Uploader)
|
||||
|
||||
original, ok := uploader.(*S3Uploader)
|
||||
So(ok, ShouldBeTrue)
|
||||
So(original.region, ShouldEqual, "us-east-1")
|
||||
So(original.bucket, ShouldEqual, "my.bucket.com")
|
||||
@ -59,9 +64,12 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
Convey("with bucket url https://s3-us-west-2.amazonaws.com/mybucket", func() {
|
||||
s3sec, err := setting.Raw.GetSection("external_image_storage.s3")
|
||||
So(err, ShouldBeNil)
|
||||
s3sec.NewKey("bucket_url", "https://s3-us-west-2.amazonaws.com/my.bucket.com")
|
||||
s3sec.NewKey("access_key", "access_key")
|
||||
s3sec.NewKey("secret_key", "secret_key")
|
||||
_, err = s3sec.NewKey("bucket_url", "https://s3-us-west-2.amazonaws.com/my.bucket.com")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = s3sec.NewKey("access_key", "access_key")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = s3sec.NewKey("secret_key", "secret_key")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
So(err, ShouldBeNil)
|
||||
@ -76,23 +84,24 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
})
|
||||
|
||||
Convey("Webdav uploader", func() {
|
||||
var err error
|
||||
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
setting.ImageUploadProvider = "webdav"
|
||||
|
||||
webdavSec, err := cfg.Raw.GetSection("external_image_storage.webdav")
|
||||
So(err, ShouldBeNil)
|
||||
webdavSec.NewKey("url", "webdavUrl")
|
||||
webdavSec.NewKey("username", "username")
|
||||
webdavSec.NewKey("password", "password")
|
||||
_, err = webdavSec.NewKey("url", "webdavUrl")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = webdavSec.NewKey("username", "username")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = webdavSec.NewKey("password", "password")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
|
||||
So(err, ShouldBeNil)
|
||||
original, ok := uploader.(*WebdavUploader)
|
||||
|
||||
@ -103,19 +112,20 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
})
|
||||
|
||||
Convey("GCS uploader", func() {
|
||||
var err error
|
||||
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
setting.ImageUploadProvider = "gcs"
|
||||
|
||||
gcpSec, err := cfg.Raw.GetSection("external_image_storage.gcs")
|
||||
So(err, ShouldBeNil)
|
||||
gcpSec.NewKey("key_file", "/etc/secrets/project-79a52befa3f6.json")
|
||||
gcpSec.NewKey("bucket", "project-grafana-east")
|
||||
_, err = gcpSec.NewKey("key_file", "/etc/secrets/project-79a52befa3f6.json")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = gcpSec.NewKey("bucket", "project-grafana-east")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
So(err, ShouldBeNil)
|
||||
@ -128,17 +138,22 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
|
||||
Convey("AzureBlobUploader config", func() {
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
setting.ImageUploadProvider = "azure_blob"
|
||||
|
||||
Convey("with container name", func() {
|
||||
azureBlobSec, err := cfg.Raw.GetSection("external_image_storage.azure_blob")
|
||||
So(err, ShouldBeNil)
|
||||
azureBlobSec.NewKey("account_name", "account_name")
|
||||
azureBlobSec.NewKey("account_key", "account_key")
|
||||
azureBlobSec.NewKey("container_name", "container_name")
|
||||
_, err = azureBlobSec.NewKey("account_name", "account_name")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = azureBlobSec.NewKey("account_key", "account_key")
|
||||
So(err, ShouldBeNil)
|
||||
_, err = azureBlobSec.NewKey("container_name", "container_name")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
So(err, ShouldBeNil)
|
||||
@ -152,20 +167,18 @@ func TestImageUploaderFactory(t *testing.T) {
|
||||
})
|
||||
|
||||
Convey("Local uploader", func() {
|
||||
var err error
|
||||
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
setting.ImageUploadProvider = "local"
|
||||
|
||||
uploader, err := NewImageUploader()
|
||||
|
||||
So(err, ShouldBeNil)
|
||||
original, ok := uploader.(*LocalUploader)
|
||||
|
||||
original, ok := uploader.(*LocalUploader)
|
||||
So(ok, ShouldBeTrue)
|
||||
So(original, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -11,14 +11,15 @@ import (
|
||||
func TestUploadToS3(t *testing.T) {
|
||||
SkipConvey("[Integration test] for external_image_store.s3", t, func() {
|
||||
cfg := setting.NewCfg()
|
||||
cfg.Load(&setting.CommandLineArgs{
|
||||
err := cfg.Load(&setting.CommandLineArgs{
|
||||
HomePath: "../../../",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
s3Uploader, _ := NewImageUploader()
|
||||
s3Uploader, err := NewImageUploader()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
path, err := s3Uploader.Upload(context.Background(), "../../../public/img/logo_transparent_400x.png")
|
||||
|
||||
So(err, ShouldBeNil)
|
||||
So(path, ShouldNotEqual, "")
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user