From 4356e980f01c7e32bbbecde3e3364cb7ba06c350 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Mon, 27 Nov 2017 17:08:39 +0100 Subject: [PATCH] dashfolders: create app folder on dashboard import --- pkg/plugins/dashboard_importer.go | 25 ++++++++++++++++ pkg/plugins/dashboard_importer_test.go | 40 +++++++++++++++++-------- pkg/plugins/dashboards.go | 10 +++++++ pkg/services/sqlstore/dashboard.go | 2 +- pkg/services/sqlstore/dashboard_test.go | 37 +++++++++++++++++++++++ 5 files changed, 101 insertions(+), 13 deletions(-) diff --git a/pkg/plugins/dashboard_importer.go b/pkg/plugins/dashboard_importer.go index 1b3e4bac182..bc8258359b0 100644 --- a/pkg/plugins/dashboard_importer.go +++ b/pkg/plugins/dashboard_importer.go @@ -49,6 +49,30 @@ func ImportDashboard(cmd *ImportDashboardCommand) error { if dashboard, err = loadPluginDashboard(cmd.PluginId, cmd.Path); err != nil { return err } + + var plugin *PluginBase + + if plugin, err = getPlugin(cmd.PluginId); err != nil { + return err + } + + folderDash := simplejson.NewFromAny(map[string]interface{}{ + "title": plugin.Name, + }) + + saveCmd := m.SaveDashboardCommand{ + Dashboard: folderDash, + OrgId: cmd.OrgId, + UserId: cmd.UserId, + PluginId: cmd.PluginId, + IsFolder: true, + } + + if err := bus.Dispatch(&saveCmd); err != nil { + return err + } + + dashboard.FolderId = saveCmd.Result.Id } else { dashboard = m.NewDashboardFromJson(cmd.Dashboard) } @@ -69,6 +93,7 @@ func ImportDashboard(cmd *ImportDashboardCommand) error { UserId: cmd.UserId, Overwrite: cmd.Overwrite, PluginId: cmd.PluginId, + FolderId: dashboard.FolderId, } if err := bus.Dispatch(&saveCmd); err != nil { diff --git a/pkg/plugins/dashboard_importer_test.go b/pkg/plugins/dashboard_importer_test.go index d2897fad1cd..7fdd3be0961 100644 --- a/pkg/plugins/dashboard_importer_test.go +++ b/pkg/plugins/dashboard_importer_test.go @@ -22,10 +22,19 @@ func TestDashboardImport(t *testing.T) { So(err, ShouldBeNil) + folderId := int64(1000) var importedDash *m.Dashboard + var createdFolder *m.Dashboard bus.AddHandler("test", func(cmd *m.SaveDashboardCommand) error { - importedDash = cmd.GetDashboardModel() - cmd.Result = importedDash + if cmd.IsFolder { + createdFolder = cmd.GetDashboardModel() + createdFolder.Id = folderId + cmd.Result = createdFolder + } else { + importedDash = cmd.GetDashboardModel() + cmd.Result = importedDash + } + return nil }) @@ -54,21 +63,28 @@ func TestDashboardImport(t *testing.T) { panel := importedDash.Data.Get("rows").GetIndex(0).Get("panels").GetIndex(0) So(panel.Get("datasource").MustString(), ShouldEqual, "graphite") + + So(importedDash.FolderId, ShouldEqual, folderId) + }) + + Convey("should create app folder", func() { + So(createdFolder.Title, ShouldEqual, "Test App") + So(createdFolder.Id, ShouldEqual, folderId) }) }) Convey("When evaling dashboard template", t, func() { template, _ := simplejson.NewJson([]byte(`{ - "__inputs": [ - { - "name": "DS_NAME", - "type": "datasource" - } - ], - "test": { - "prop": "${DS_NAME}" - } - }`)) + "__inputs": [ + { + "name": "DS_NAME", + "type": "datasource" + } + ], + "test": { + "prop": "${DS_NAME}" + } + }`)) evaluator := &DashTemplateEvaluator{ template: template, diff --git a/pkg/plugins/dashboards.go b/pkg/plugins/dashboards.go index 37e3d8c0076..2214ad6e213 100644 --- a/pkg/plugins/dashboards.go +++ b/pkg/plugins/dashboards.go @@ -108,3 +108,13 @@ func loadPluginDashboard(pluginId, path string) (*m.Dashboard, error) { return m.NewDashboardFromJson(data), nil } + +func getPlugin(pluginId string) (*PluginBase, error) { + plugin, exists := Plugins[pluginId] + + if !exists { + return nil, PluginNotFoundError{pluginId} + } + + return plugin, nil +} diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index e808a97e8f8..8ab0d50b85f 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -340,7 +340,7 @@ func GetDashboards(query *m.GetDashboardsQuery) error { func GetDashboardsByPluginId(query *m.GetDashboardsByPluginIdQuery) error { var dashboards = make([]*m.Dashboard, 0) - err := x.Where("org_id=? AND plugin_id=?", query.OrgId, query.PluginId).Find(&dashboards) + err := x.Where("org_id=? AND plugin_id=? AND is_folder=0", query.OrgId, query.PluginId).Find(&dashboards) query.Result = dashboards if err != nil { diff --git a/pkg/services/sqlstore/dashboard_test.go b/pkg/services/sqlstore/dashboard_test.go index b8f915f7245..a552bd0546a 100644 --- a/pkg/services/sqlstore/dashboard_test.go +++ b/pkg/services/sqlstore/dashboard_test.go @@ -458,6 +458,25 @@ func TestDashboardDataAccess(t *testing.T) { }) }) }) + + Convey("Given a plugin with imported dashboards", func() { + pluginId := "test-app" + + appFolder := insertTestDashboardForPlugin("app-test", 1, 0, true, pluginId) + insertTestDashboardForPlugin("app-dash1", 1, appFolder.Id, false, pluginId) + insertTestDashboardForPlugin("app-dash2", 1, appFolder.Id, false, pluginId) + + Convey("Should return imported dashboard", func() { + query := m.GetDashboardsByPluginIdQuery{ + PluginId: pluginId, + OrgId: 1, + } + + err := GetDashboardsByPluginId(&query) + So(err, ShouldBeNil) + So(len(query.Result), ShouldEqual, 2) + }) + }) }) } @@ -479,6 +498,24 @@ func insertTestDashboard(title string, orgId int64, folderId int64, isFolder boo return cmd.Result } +func insertTestDashboardForPlugin(title string, orgId int64, folderId int64, isFolder bool, pluginId string) *m.Dashboard { + cmd := m.SaveDashboardCommand{ + OrgId: orgId, + FolderId: folderId, + IsFolder: isFolder, + Dashboard: simplejson.NewFromAny(map[string]interface{}{ + "id": nil, + "title": title, + }), + PluginId: pluginId, + } + + err := SaveDashboard(&cmd) + So(err, ShouldBeNil) + + return cmd.Result +} + func createUser(name string, role string, isAdmin bool) m.User { setting.AutoAssignOrg = true setting.AutoAssignOrgRole = role