Parcourir la source

dashfolders: don't create app folder on dashboard import if already exists

Marcus Efraimsson il y a 8 ans
Parent
commit
368a4d7aed
2 fichiers modifiés avec 128 ajouts et 22 suppressions
  1. 58 21
      pkg/plugins/dashboard_importer.go
  2. 70 1
      pkg/plugins/dashboard_importer_test.go

+ 58 - 21
pkg/plugins/dashboard_importer.go

@@ -50,29 +50,9 @@ func ImportDashboard(cmd *ImportDashboardCommand) error {
 			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 {
+		if err = createDashboardFolderForPlugin(cmd, dashboard); err != nil {
 			return err
 		}
-
-		dashboard.FolderId = saveCmd.Result.Id
 	} else {
 		dashboard = m.NewDashboardFromJson(cmd.Dashboard)
 	}
@@ -113,6 +93,63 @@ func ImportDashboard(cmd *ImportDashboardCommand) error {
 	return nil
 }
 
+func createDashboardFolderForPlugin(cmd *ImportDashboardCommand, dashboard *m.Dashboard) error {
+	var err error
+	var plugin *PluginBase
+
+	if plugin, err = getPlugin(cmd.PluginId); err != nil {
+		return err
+	}
+
+	var pluginType string
+
+	if plugin.Type == "datasource" {
+		pluginType = "Datasource"
+	} else if plugin.Type == "app" {
+		pluginType = "App"
+	}
+
+	folderTitle := fmt.Sprint(pluginType, ": ", plugin.Name)
+
+	folderDash := simplejson.NewFromAny(map[string]interface{}{
+		"schemaVersion": 16,
+		"title":         folderTitle,
+		"editable":      true,
+		"hideControls":  true,
+	})
+
+	saveCmd := m.SaveDashboardCommand{
+		Dashboard: folderDash,
+		OrgId:     cmd.OrgId,
+		UserId:    cmd.UserId,
+		PluginId:  cmd.PluginId,
+		IsFolder:  true,
+	}
+
+	dashModel := saveCmd.GetDashboardModel()
+
+	getDashboardQuery := m.GetDashboardQuery{
+		OrgId: cmd.OrgId,
+		Slug:  dashModel.Slug,
+	}
+
+	if err := bus.Dispatch(&getDashboardQuery); err != nil {
+		return err
+	}
+
+	if getDashboardQuery.Result != nil {
+		dashboard.FolderId = getDashboardQuery.Result.Id
+		return nil
+	}
+
+	if err := bus.Dispatch(&saveCmd); err != nil {
+		return err
+	}
+
+	dashboard.FolderId = saveCmd.Result.Id
+	return nil
+}
+
 type DashTemplateEvaluator struct {
 	template  *simplejson.Json
 	inputs    []ImportDashboardInput

+ 70 - 1
pkg/plugins/dashboard_importer_test.go

@@ -38,6 +38,10 @@ func TestDashboardImport(t *testing.T) {
 			return nil
 		})
 
+		bus.AddHandler("test", func(cmd *m.GetDashboardQuery) error {
+			return nil
+		})
+
 		cmd := ImportDashboardCommand{
 			PluginId: "test-app",
 			Path:     "dashboards/connections.json",
@@ -68,11 +72,76 @@ func TestDashboardImport(t *testing.T) {
 		})
 
 		Convey("should create app folder", func() {
-			So(createdFolder.Title, ShouldEqual, "Test App")
+			So(createdFolder.Title, ShouldEqual, "App: Test App")
 			So(createdFolder.Id, ShouldEqual, folderId)
 		})
 	})
 
+	Convey("When re-importing plugin dashboard", t, func() {
+		setting.Cfg = ini.Empty()
+		sec, _ := setting.Cfg.NewSection("plugin.test-app")
+		sec.NewKey("path", "../../tests/test-app")
+		err := Init()
+
+		So(err, ShouldBeNil)
+
+		folderId := int64(1000)
+		var importedDash *m.Dashboard
+		var createdFolder *m.Dashboard
+		bus.AddHandler("test", func(cmd *m.SaveDashboardCommand) error {
+			if cmd.IsFolder {
+				cmd.Result = cmd.GetDashboardModel()
+			} else {
+				importedDash = cmd.GetDashboardModel()
+				cmd.Result = importedDash
+			}
+
+			return nil
+		})
+
+		bus.AddHandler("test", func(cmd *m.GetDashboardQuery) error {
+			cmd.Result = &m.Dashboard{
+				Id:    1000,
+				Title: "Something",
+			}
+
+			return nil
+		})
+
+		cmd := ImportDashboardCommand{
+			PluginId: "test-app",
+			Path:     "dashboards/connections.json",
+			OrgId:    1,
+			UserId:   1,
+			Inputs: []ImportDashboardInput{
+				{Name: "*", Type: "datasource", Value: "graphite"},
+			},
+		}
+
+		err = ImportDashboard(&cmd)
+		So(err, ShouldBeNil)
+
+		Convey("should install dashboard", func() {
+			So(importedDash, ShouldNotBeNil)
+
+			resultStr, _ := importedDash.Data.EncodePretty()
+			expectedBytes, _ := ioutil.ReadFile("../../tests/test-app/dashboards/connections_result.json")
+			expectedJson, _ := simplejson.NewJson(expectedBytes)
+			expectedStr, _ := expectedJson.EncodePretty()
+
+			So(string(resultStr), ShouldEqual, string(expectedStr))
+
+			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 not create app folder", func() {
+			So(createdFolder, ShouldBeNil)
+		})
+	})
+
 	Convey("When evaling dashboard template", t, func() {
 		template, _ := simplejson.NewJson([]byte(`{
 		"__inputs": [