mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
ObjectStore: Add folder to kind registry (#57461)
This commit is contained in:
@@ -3,6 +3,7 @@ package dashboard
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
@@ -29,6 +30,16 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder {
|
|||||||
// This implementation moves datasources referenced by internal ID or name to UID
|
// This implementation moves datasources referenced by internal ID or name to UID
|
||||||
func NewStaticDashboardSummaryBuilder(lookup DatasourceLookup) models.ObjectSummaryBuilder {
|
func NewStaticDashboardSummaryBuilder(lookup DatasourceLookup) models.ObjectSummaryBuilder {
|
||||||
return func(ctx context.Context, uid string, body []byte) (*models.ObjectSummary, []byte, error) {
|
return func(ctx context.Context, uid string, body []byte) (*models.ObjectSummary, []byte, error) {
|
||||||
|
var parsed map[string]interface{}
|
||||||
|
err := json.Unmarshal(body, &parsed)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err // did not parse
|
||||||
|
}
|
||||||
|
// values that should be managed by the container
|
||||||
|
delete(parsed, "uid")
|
||||||
|
delete(parsed, "version")
|
||||||
|
// slug? (derived from title)
|
||||||
|
|
||||||
summary := &models.ObjectSummary{
|
summary := &models.ObjectSummary{
|
||||||
Labels: make(map[string]string),
|
Labels: make(map[string]string),
|
||||||
Fields: make(map[string]interface{}),
|
Fields: make(map[string]interface{}),
|
||||||
@@ -87,6 +98,7 @@ func NewStaticDashboardSummaryBuilder(lookup DatasourceLookup) models.ObjectSumm
|
|||||||
}
|
}
|
||||||
|
|
||||||
summary.References = dashboardRefs.Get()
|
summary.References = dashboardRefs.Get()
|
||||||
return summary, body, nil
|
out, err := json.MarshalIndent(parsed, "", " ")
|
||||||
|
return summary, out, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
45
pkg/services/store/kind/folder/summary.go
Normal file
45
pkg/services/store/kind/folder/summary.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package folder
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/store"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Model struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetObjectKindInfo() models.ObjectKindInfo {
|
||||||
|
return models.ObjectKindInfo{
|
||||||
|
ID: models.StandardKindFolder,
|
||||||
|
Name: "Folder",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetObjectSummaryBuilder() models.ObjectSummaryBuilder {
|
||||||
|
return func(ctx context.Context, uid string, body []byte) (*models.ObjectSummary, []byte, error) {
|
||||||
|
obj := &Model{}
|
||||||
|
err := json.Unmarshal(body, obj)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err // unable to read object
|
||||||
|
}
|
||||||
|
|
||||||
|
if obj.Name == "" {
|
||||||
|
obj.Name = store.GuessNameFromUID(uid)
|
||||||
|
}
|
||||||
|
|
||||||
|
summary := &models.ObjectSummary{
|
||||||
|
Kind: models.StandardKindFolder,
|
||||||
|
Name: obj.Name,
|
||||||
|
Description: obj.Description,
|
||||||
|
UID: uid,
|
||||||
|
}
|
||||||
|
|
||||||
|
out, err := json.MarshalIndent(obj, "", " ")
|
||||||
|
return summary, out, err
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetObjectKindInfo() models.ObjectKindInfo {
|
func GetObjectKindInfo() models.ObjectKindInfo {
|
||||||
@@ -40,7 +40,7 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder {
|
|||||||
|
|
||||||
summary := &models.ObjectSummary{
|
summary := &models.ObjectSummary{
|
||||||
Kind: models.StandardKindGeoJSON,
|
Kind: models.StandardKindGeoJSON,
|
||||||
Name: guessNameFromUID(uid),
|
Name: store.GuessNameFromUID(uid),
|
||||||
UID: uid,
|
UID: uid,
|
||||||
Fields: map[string]interface{}{
|
Fields: map[string]interface{}{
|
||||||
"type": ftype,
|
"type": ftype,
|
||||||
@@ -57,15 +57,3 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder {
|
|||||||
return summary, body, nil
|
return summary, body, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func guessNameFromUID(uid string) string {
|
|
||||||
sidx := strings.LastIndex(uid, "/") + 1
|
|
||||||
didx := strings.LastIndex(uid, ".")
|
|
||||||
if didx > sidx && didx != sidx {
|
|
||||||
return uid[sidx:didx]
|
|
||||||
}
|
|
||||||
if sidx > 0 {
|
|
||||||
return uid[sidx:]
|
|
||||||
}
|
|
||||||
return uid
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -34,8 +34,9 @@ func summaryBuilder(ctx context.Context, uid string, body []byte) (*models.Objec
|
|||||||
obj.Items = &temp
|
obj.Items = &temp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obj.Uid = uid // make sure they are consistent
|
||||||
summary := &models.ObjectSummary{
|
summary := &models.ObjectSummary{
|
||||||
UID: obj.Uid,
|
UID: uid,
|
||||||
Name: obj.Name,
|
Name: obj.Name,
|
||||||
Description: fmt.Sprintf("%d items, refreshed every %s", len(*obj.Items), obj.Interval),
|
Description: fmt.Sprintf("%d items, refreshed every %s", len(*obj.Items), obj.Interval),
|
||||||
}
|
}
|
||||||
@@ -62,6 +63,6 @@ func summaryBuilder(ctx context.Context, uid string, body []byte) (*models.Objec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out, err := json.Marshal(obj)
|
out, err := json.MarshalIndent(obj, "", " ")
|
||||||
return summary, out, err
|
return summary, out, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"image/png"
|
"image/png"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetObjectKindInfo() models.ObjectKindInfo {
|
func GetObjectKindInfo() models.ObjectKindInfo {
|
||||||
@@ -31,7 +31,7 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder {
|
|||||||
size := img.Bounds().Size()
|
size := img.Bounds().Size()
|
||||||
summary := &models.ObjectSummary{
|
summary := &models.ObjectSummary{
|
||||||
Kind: models.StandardKindSVG,
|
Kind: models.StandardKindSVG,
|
||||||
Name: guessNameFromUID(uid),
|
Name: store.GuessNameFromUID(uid),
|
||||||
UID: uid,
|
UID: uid,
|
||||||
Fields: map[string]interface{}{
|
Fields: map[string]interface{}{
|
||||||
"width": int64(size.X),
|
"width": int64(size.X),
|
||||||
@@ -41,15 +41,3 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder {
|
|||||||
return summary, body, nil
|
return summary, body, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func guessNameFromUID(uid string) string {
|
|
||||||
sidx := strings.LastIndex(uid, "/") + 1
|
|
||||||
didx := strings.LastIndex(uid, ".")
|
|
||||||
if didx > sidx && didx != sidx {
|
|
||||||
return uid[sidx:didx]
|
|
||||||
}
|
|
||||||
if sidx > 0 {
|
|
||||||
return uid[sidx:]
|
|
||||||
}
|
|
||||||
return uid
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/rendering"
|
"github.com/grafana/grafana/pkg/services/rendering"
|
||||||
"github.com/grafana/grafana/pkg/services/store/kind/dashboard"
|
"github.com/grafana/grafana/pkg/services/store/kind/dashboard"
|
||||||
"github.com/grafana/grafana/pkg/services/store/kind/dummy"
|
"github.com/grafana/grafana/pkg/services/store/kind/dummy"
|
||||||
|
"github.com/grafana/grafana/pkg/services/store/kind/folder"
|
||||||
"github.com/grafana/grafana/pkg/services/store/kind/geojson"
|
"github.com/grafana/grafana/pkg/services/store/kind/geojson"
|
||||||
"github.com/grafana/grafana/pkg/services/store/kind/playlist"
|
"github.com/grafana/grafana/pkg/services/store/kind/playlist"
|
||||||
"github.com/grafana/grafana/pkg/services/store/kind/png"
|
"github.com/grafana/grafana/pkg/services/store/kind/png"
|
||||||
@@ -33,6 +34,10 @@ func NewKindRegistry() KindRegistry {
|
|||||||
info: dashboard.GetObjectKindInfo(),
|
info: dashboard.GetObjectKindInfo(),
|
||||||
builder: dashboard.GetObjectSummaryBuilder(),
|
builder: dashboard.GetObjectSummaryBuilder(),
|
||||||
}
|
}
|
||||||
|
kinds[models.StandardKindFolder] = &kindValues{
|
||||||
|
info: folder.GetObjectKindInfo(),
|
||||||
|
builder: folder.GetObjectSummaryBuilder(),
|
||||||
|
}
|
||||||
kinds[models.StandardKindPNG] = &kindValues{
|
kinds[models.StandardKindPNG] = &kindValues{
|
||||||
info: png.GetObjectKindInfo(),
|
info: png.GetObjectKindInfo(),
|
||||||
builder: png.GetObjectSummaryBuilder(),
|
builder: png.GetObjectSummaryBuilder(),
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ func TestKindRegistry(t *testing.T) {
|
|||||||
require.Equal(t, []string{
|
require.Equal(t, []string{
|
||||||
"dashboard",
|
"dashboard",
|
||||||
"dummy",
|
"dummy",
|
||||||
|
"folder",
|
||||||
"geojson",
|
"geojson",
|
||||||
"kind1",
|
"kind1",
|
||||||
"kind2",
|
"kind2",
|
||||||
|
|||||||
@@ -7,6 +7,18 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/web"
|
"github.com/grafana/grafana/pkg/web"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func GuessNameFromUID(uid string) string {
|
||||||
|
sidx := strings.LastIndex(uid, "/") + 1
|
||||||
|
didx := strings.LastIndex(uid, ".")
|
||||||
|
if didx > sidx && didx != sidx {
|
||||||
|
return uid[sidx:didx]
|
||||||
|
}
|
||||||
|
if sidx > 0 {
|
||||||
|
return uid[sidx:]
|
||||||
|
}
|
||||||
|
return uid
|
||||||
|
}
|
||||||
|
|
||||||
func splitFirstSegment(path string) (string, string) {
|
func splitFirstSegment(path string) (string, string) {
|
||||||
idx := strings.Index(path, "/")
|
idx := strings.Index(path, "/")
|
||||||
if idx == 0 {
|
if idx == 0 {
|
||||||
|
|||||||
@@ -7,6 +7,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestUtils(t *testing.T) {
|
func TestUtils(t *testing.T) {
|
||||||
|
require.Equal(t, "name", GuessNameFromUID("hello/name.xyz"))
|
||||||
|
require.Equal(t, "name", GuessNameFromUID("name.xyz"))
|
||||||
|
require.Equal(t, "name", GuessNameFromUID("name"))
|
||||||
|
require.Equal(t, "name", GuessNameFromUID("name."))
|
||||||
|
require.Equal(t, "name", GuessNameFromUID("/name."))
|
||||||
|
|
||||||
a, b := splitFirstSegment("")
|
a, b := splitFirstSegment("")
|
||||||
require.Equal(t, "", a)
|
require.Equal(t, "", a)
|
||||||
require.Equal(t, "", b)
|
require.Equal(t, "", b)
|
||||||
|
|||||||
Reference in New Issue
Block a user