From 910154c1025f82992be02db4eb268142fd223b00 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Fri, 21 Oct 2022 13:48:32 -0700 Subject: [PATCH] ObjectStore: Add folder to kind registry (#57461) --- pkg/services/store/kind/dashboard/summary.go | 14 +++++- pkg/services/store/kind/folder/summary.go | 45 ++++++++++++++++++++ pkg/services/store/kind/geojson/summary.go | 16 +------ pkg/services/store/kind/playlist/summary.go | 5 ++- pkg/services/store/kind/png/summary.go | 16 +------ pkg/services/store/kind/registry.go | 5 +++ pkg/services/store/kind/registry_test.go | 1 + pkg/services/store/utils.go | 12 ++++++ pkg/services/store/utils_test.go | 6 +++ 9 files changed, 89 insertions(+), 31 deletions(-) create mode 100644 pkg/services/store/kind/folder/summary.go diff --git a/pkg/services/store/kind/dashboard/summary.go b/pkg/services/store/kind/dashboard/summary.go index 0f5259ba1ed..cb1521c4c01 100644 --- a/pkg/services/store/kind/dashboard/summary.go +++ b/pkg/services/store/kind/dashboard/summary.go @@ -3,6 +3,7 @@ package dashboard import ( "bytes" "context" + "encoding/json" "fmt" "strconv" @@ -29,6 +30,16 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder { // This implementation moves datasources referenced by internal ID or name to UID func NewStaticDashboardSummaryBuilder(lookup DatasourceLookup) models.ObjectSummaryBuilder { 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{ Labels: make(map[string]string), Fields: make(map[string]interface{}), @@ -87,6 +98,7 @@ func NewStaticDashboardSummaryBuilder(lookup DatasourceLookup) models.ObjectSumm } summary.References = dashboardRefs.Get() - return summary, body, nil + out, err := json.MarshalIndent(parsed, "", " ") + return summary, out, err } } diff --git a/pkg/services/store/kind/folder/summary.go b/pkg/services/store/kind/folder/summary.go new file mode 100644 index 00000000000..9509ab8d8de --- /dev/null +++ b/pkg/services/store/kind/folder/summary.go @@ -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 + } +} diff --git a/pkg/services/store/kind/geojson/summary.go b/pkg/services/store/kind/geojson/summary.go index 1c3141be65d..171d8a4ee47 100644 --- a/pkg/services/store/kind/geojson/summary.go +++ b/pkg/services/store/kind/geojson/summary.go @@ -4,9 +4,9 @@ import ( "context" "encoding/json" "fmt" - "strings" "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/services/store" ) func GetObjectKindInfo() models.ObjectKindInfo { @@ -40,7 +40,7 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder { summary := &models.ObjectSummary{ Kind: models.StandardKindGeoJSON, - Name: guessNameFromUID(uid), + Name: store.GuessNameFromUID(uid), UID: uid, Fields: map[string]interface{}{ "type": ftype, @@ -57,15 +57,3 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder { 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 -} diff --git a/pkg/services/store/kind/playlist/summary.go b/pkg/services/store/kind/playlist/summary.go index fe070a4ef1a..2221f7cbe94 100644 --- a/pkg/services/store/kind/playlist/summary.go +++ b/pkg/services/store/kind/playlist/summary.go @@ -34,8 +34,9 @@ func summaryBuilder(ctx context.Context, uid string, body []byte) (*models.Objec obj.Items = &temp } + obj.Uid = uid // make sure they are consistent summary := &models.ObjectSummary{ - UID: obj.Uid, + UID: uid, Name: obj.Name, 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 } diff --git a/pkg/services/store/kind/png/summary.go b/pkg/services/store/kind/png/summary.go index a1abc078443..722a0093eef 100644 --- a/pkg/services/store/kind/png/summary.go +++ b/pkg/services/store/kind/png/summary.go @@ -4,9 +4,9 @@ import ( "bytes" "context" "image/png" - "strings" "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/services/store" ) func GetObjectKindInfo() models.ObjectKindInfo { @@ -31,7 +31,7 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder { size := img.Bounds().Size() summary := &models.ObjectSummary{ Kind: models.StandardKindSVG, - Name: guessNameFromUID(uid), + Name: store.GuessNameFromUID(uid), UID: uid, Fields: map[string]interface{}{ "width": int64(size.X), @@ -41,15 +41,3 @@ func GetObjectSummaryBuilder() models.ObjectSummaryBuilder { 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 -} diff --git a/pkg/services/store/kind/registry.go b/pkg/services/store/kind/registry.go index edebae138a4..e2ef913147e 100644 --- a/pkg/services/store/kind/registry.go +++ b/pkg/services/store/kind/registry.go @@ -9,6 +9,7 @@ import ( "github.com/grafana/grafana/pkg/services/rendering" "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/folder" "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/png" @@ -33,6 +34,10 @@ func NewKindRegistry() KindRegistry { info: dashboard.GetObjectKindInfo(), builder: dashboard.GetObjectSummaryBuilder(), } + kinds[models.StandardKindFolder] = &kindValues{ + info: folder.GetObjectKindInfo(), + builder: folder.GetObjectSummaryBuilder(), + } kinds[models.StandardKindPNG] = &kindValues{ info: png.GetObjectKindInfo(), builder: png.GetObjectSummaryBuilder(), diff --git a/pkg/services/store/kind/registry_test.go b/pkg/services/store/kind/registry_test.go index f3e9a78bc37..7bfd013c3c6 100644 --- a/pkg/services/store/kind/registry_test.go +++ b/pkg/services/store/kind/registry_test.go @@ -21,6 +21,7 @@ func TestKindRegistry(t *testing.T) { require.Equal(t, []string{ "dashboard", "dummy", + "folder", "geojson", "kind1", "kind2", diff --git a/pkg/services/store/utils.go b/pkg/services/store/utils.go index f7fd341ac47..fe275b51291 100644 --- a/pkg/services/store/utils.go +++ b/pkg/services/store/utils.go @@ -7,6 +7,18 @@ import ( "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) { idx := strings.Index(path, "/") if idx == 0 { diff --git a/pkg/services/store/utils_test.go b/pkg/services/store/utils_test.go index c05f4d096f5..04b5f17db08 100644 --- a/pkg/services/store/utils_test.go +++ b/pkg/services/store/utils_test.go @@ -7,6 +7,12 @@ import ( ) 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("") require.Equal(t, "", a) require.Equal(t, "", b)