grafana/pkg/services/store/storage_disk.go
2022-10-25 09:27:22 +08:00

99 lines
2.2 KiB
Go

package store
import (
"context"
"strings"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/infra/filestorage"
"gocloud.dev/blob"
)
const rootStorageTypeDisk = "disk"
var _ storageRuntime = &rootStorageDisk{}
type rootStorageDisk struct {
settings *StorageLocalDiskConfig
meta RootStorageMeta
store filestorage.FileStorage
}
func newDiskStorage(meta RootStorageMeta, scfg RootStorageConfig) *rootStorageDisk {
cfg := scfg.Disk
if cfg == nil {
cfg = &StorageLocalDiskConfig{}
scfg.Disk = cfg
}
scfg.Type = rootStorageTypeDisk
meta.Config = scfg
if scfg.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{
settings: cfg,
}
if meta.Notice == nil {
protocol := "file:///"
path := protocol + cfg.Path
bucket, err := blob.OpenBucket(context.Background(), path)
if err != nil {
grafanaStorageLogger.Warn("error loading storage", "prefix", scfg.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
return s
}
func (s *rootStorageDisk) Meta() RootStorageMeta {
return s.meta
}
func (s *rootStorageDisk) Store() filestorage.FileStorage {
return s.store
}
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
}