mirror of
https://github.com/grafana/grafana.git
synced 2024-11-28 11:44:26 -06:00
9f0b6a5754
* Storage: refactor filtering, improve performance * added a comment to `newpathfilter` * after merge fixes
92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
|
"github.com/grafana/grafana/pkg/infra/filestorage"
|
|
"gocloud.dev/blob"
|
|
)
|
|
|
|
const rootStorageTypeDisk = "disk"
|
|
|
|
type rootStorageDisk struct {
|
|
baseStorageRuntime
|
|
|
|
settings *StorageLocalDiskConfig
|
|
}
|
|
|
|
func newDiskStorage(prefix string, name string, cfg *StorageLocalDiskConfig) *rootStorageDisk {
|
|
if cfg == nil {
|
|
cfg = &StorageLocalDiskConfig{}
|
|
}
|
|
|
|
meta := RootStorageMeta{
|
|
Config: RootStorageConfig{
|
|
Type: rootStorageTypeDisk,
|
|
Prefix: prefix,
|
|
Name: name,
|
|
Disk: cfg,
|
|
},
|
|
}
|
|
if prefix == "" {
|
|
meta.Notice = append(meta.Notice, data.Notice{
|
|
Severity: data.NoticeSeverityError,
|
|
Text: "Missing prefix",
|
|
})
|
|
}
|
|
if cfg.Path == "" {
|
|
meta.Notice = append(meta.Notice, data.Notice{
|
|
Severity: data.NoticeSeverityError,
|
|
Text: "Missing path configuration",
|
|
})
|
|
}
|
|
s := &rootStorageDisk{}
|
|
|
|
if meta.Notice == nil {
|
|
path := fmt.Sprintf("file://%s", cfg.Path)
|
|
bucket, err := blob.OpenBucket(context.Background(), path)
|
|
if err != nil {
|
|
grafanaStorageLogger.Warn("error loading storage", "prefix", prefix, "err", err)
|
|
meta.Notice = append(meta.Notice, data.Notice{
|
|
Severity: data.NoticeSeverityError,
|
|
Text: "Failed to initialize storage",
|
|
})
|
|
} else {
|
|
s.store = filestorage.NewCdkBlobStorage(grafanaStorageLogger,
|
|
bucket, "",
|
|
filestorage.NewPathFilter(cfg.Roots, nil, nil, nil))
|
|
|
|
meta.Ready = true // exists!
|
|
}
|
|
}
|
|
|
|
s.meta = meta
|
|
s.settings = cfg
|
|
return s
|
|
}
|
|
|
|
func (s *rootStorageDisk) Sync() error {
|
|
return nil // already in sync
|
|
}
|
|
|
|
// with local disk user metadata and messages are lost
|
|
func (s *rootStorageDisk) Write(ctx context.Context, cmd *WriteValueRequest) (*WriteValueResponse, error) {
|
|
byteAray := []byte(cmd.Body)
|
|
|
|
path := cmd.Path
|
|
if !strings.HasPrefix(path, filestorage.Delimiter) {
|
|
path = filestorage.Delimiter + path
|
|
}
|
|
err := s.store.Upsert(ctx, &filestorage.UpsertFileCommand{
|
|
Path: path,
|
|
Contents: byteAray,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &WriteValueResponse{Code: 200}, nil
|
|
}
|