LibraryPanels: Fixes error when importing plugin dashboard (#34557) (#34559)

(cherry picked from commit 7b17801047)

Co-authored-by: Hugo Häggmark <hugo.haggmark@grafana.com>
This commit is contained in:
Grot (@grafanabot)
2021-05-24 09:56:15 +02:00
committed by GitHub
co-authored by Hugo Häggmark
parent 52d6afbae7
commit 603cff9491
8 changed files with 11 additions and 123 deletions
@@ -18,7 +18,6 @@ type Service interface {
LoadLibraryPanelsForDashboard(c *models.ReqContext, dash *models.Dashboard) error
CleanLibraryPanelsForDashboard(dash *models.Dashboard) error
ConnectLibraryPanelsForDashboard(c *models.ReqContext, dash *models.Dashboard) error
ImportDashboard(c *models.ReqContext, dashboard *simplejson.Json, importedID int64) error
}
// LibraryPanelService is the service for the Panel Library feature.
@@ -193,11 +192,3 @@ func (lps *LibraryPanelService) ConnectLibraryPanelsForDashboard(c *models.ReqCo
return lps.LibraryElementService.ConnectElementsToDashboard(c, elementUIDs, dash.Id)
}
// ImportDashboard loops through all panels in dashboard JSON and connects any library panels to the dashboard.
func (lps *LibraryPanelService) ImportDashboard(c *models.ReqContext, dashboard *simplejson.Json, importedID int64) error {
dash := models.NewDashboardFromJson(dashboard)
dash.Id = importedID
return lps.ConnectLibraryPanelsForDashboard(c, dash)
}
@@ -572,106 +572,6 @@ func TestConnectLibraryPanelsForDashboard(t *testing.T) {
})
}
func TestImportDashboard(t *testing.T) {
scenarioWithLibraryPanel(t, "When an admin tries to import a dashboard with a library panel, it should connect the two",
func(t *testing.T, sc scenarioContext) {
importedJSON := map[string]interface{}{
"panels": []interface{}{},
}
importedDashboard := models.Dashboard{
Title: "Dummy dash that simulates an imported dash",
Data: simplejson.NewFromAny(importedJSON),
}
importedDashInDB := createDashboard(t, sc.sqlStore, sc.user, &importedDashboard, sc.folder.Id)
elements, err := sc.elementService.GetElementsForDashboard(sc.reqContext, importedDashInDB.Id)
require.NoError(t, err)
require.Len(t, elements, 0)
dashJSON := map[string]interface{}{
"title": "Testing ImportDashboard",
"panels": []interface{}{
map[string]interface{}{
"id": int64(1),
"gridPos": map[string]interface{}{
"h": 6,
"w": 6,
"x": 0,
"y": 0,
},
},
map[string]interface{}{
"id": int64(2),
"gridPos": map[string]interface{}{
"h": 6,
"w": 6,
"x": 6,
"y": 0,
},
"datasource": "${DS_GDEV-TESTDATA}",
"libraryPanel": map[string]interface{}{
"uid": sc.initialResult.Result.UID,
"name": sc.initialResult.Result.Name,
},
"title": "Text - Library Panel",
"type": "text",
},
},
}
dash := simplejson.NewFromAny(dashJSON)
err = sc.service.ImportDashboard(sc.reqContext, dash, importedDashInDB.Id)
require.NoError(t, err)
elements, err = sc.elementService.GetElementsForDashboard(sc.reqContext, importedDashInDB.Id)
require.NoError(t, err)
require.Len(t, elements, 1)
require.Equal(t, sc.initialResult.Result.UID, elements[sc.initialResult.Result.UID].UID)
})
scenarioWithLibraryPanel(t, "When an admin tries to import a dashboard with a library panel without uid, it should fail",
func(t *testing.T, sc scenarioContext) {
importedJSON := map[string]interface{}{
"panels": []interface{}{},
}
importedDashboard := models.Dashboard{
Title: "Dummy dash that simulates an imported dash",
Data: simplejson.NewFromAny(importedJSON),
}
importedDashInDB := createDashboard(t, sc.sqlStore, sc.user, &importedDashboard, sc.folder.Id)
dashJSON := map[string]interface{}{
"panels": []interface{}{
map[string]interface{}{
"id": int64(1),
"gridPos": map[string]interface{}{
"h": 6,
"w": 6,
"x": 0,
"y": 0,
},
},
map[string]interface{}{
"id": int64(2),
"gridPos": map[string]interface{}{
"h": 6,
"w": 6,
"x": 6,
"y": 0,
},
"datasource": "${DS_GDEV-TESTDATA}",
"libraryPanel": map[string]interface{}{
"name": sc.initialResult.Result.Name,
},
"title": "Text - Library Panel",
"type": "text",
},
},
}
dash := simplejson.NewFromAny(dashJSON)
err := sc.service.ImportDashboard(sc.reqContext, dash, importedDashInDB.Id)
require.EqualError(t, err, errLibraryPanelHeaderUIDMissing.Error())
})
}
type libraryPanel struct {
ID int64
OrgID int64