Files
grafana/pkg/services/dashboardimport/service/service.go
T
sam boyer 8876d56495 schema: Migrate from scuemata to thema (#49805)
* Remove crufty scuemata bits

Buhbye to: cue/ dir with old definitions, CI steps for checking unnecessary
things, and the original dashboard scuemata file.

* Remove grafana-cli cue subcommand

* Remove old testdata

* Don't swallow errors from codegen

* Small nits and tweaks to cuectx package

* WIP - refactor pluggen to use Thema

Also consolidate the embed.FS in the repo root.

* Finish halfway rename

* Convert all panel models.cue to thema

* Rewrite pluggen to use Thema

* Remove pkg/schema, and trim command

* Remove schemaloader service and usages

Will be replaced by coremodel-centric hydrate/dehydrate system Soon™.

* Remove schemaloader from wire

* Remove hangover field on histogram models.cue

* Fix lint errors, some vestiges of trim service

* Remove unused cuetsify cli command
2022-06-06 17:52:44 -07:00

111 lines
3.5 KiB
Go

package service
import (
"context"
"github.com/grafana/grafana/pkg/api/routing"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/dashboardimport"
"github.com/grafana/grafana/pkg/services/dashboardimport/api"
"github.com/grafana/grafana/pkg/services/dashboardimport/utils"
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/librarypanels"
"github.com/grafana/grafana/pkg/services/plugindashboards"
"github.com/grafana/grafana/pkg/services/quota"
)
func ProvideService(routeRegister routing.RouteRegister,
quotaService *quota.QuotaService,
pluginDashboardService plugindashboards.Service, pluginStore plugins.Store,
libraryPanelService librarypanels.Service, dashboardService dashboards.DashboardService,
ac accesscontrol.AccessControl,
) *ImportDashboardService {
s := &ImportDashboardService{
pluginDashboardService: pluginDashboardService,
dashboardService: dashboardService,
libraryPanelService: libraryPanelService,
}
dashboardImportAPI := api.New(s, quotaService, pluginStore, ac)
dashboardImportAPI.RegisterAPIEndpoints(routeRegister)
return s
}
type ImportDashboardService struct {
pluginDashboardService plugindashboards.Service
dashboardService dashboards.DashboardService
libraryPanelService librarypanels.Service
}
func (s *ImportDashboardService) ImportDashboard(ctx context.Context, req *dashboardimport.ImportDashboardRequest) (*dashboardimport.ImportDashboardResponse, error) {
var draftDashboard *models.Dashboard
if req.PluginId != "" {
loadReq := &plugindashboards.LoadPluginDashboardRequest{
PluginID: req.PluginId,
Reference: req.Path,
}
if resp, err := s.pluginDashboardService.LoadPluginDashboard(ctx, loadReq); err != nil {
return nil, err
} else {
draftDashboard = resp.Dashboard
}
} else {
draftDashboard = models.NewDashboardFromJson(req.Dashboard)
}
evaluator := utils.NewDashTemplateEvaluator(draftDashboard.Data, req.Inputs)
generatedDash, err := evaluator.Eval()
if err != nil {
return nil, err
}
saveCmd := models.SaveDashboardCommand{
Dashboard: generatedDash,
OrgId: req.User.OrgId,
UserId: req.User.UserId,
Overwrite: req.Overwrite,
PluginId: req.PluginId,
FolderId: req.FolderId,
}
dto := &dashboards.SaveDashboardDTO{
OrgId: saveCmd.OrgId,
Dashboard: saveCmd.GetDashboardModel(),
Overwrite: saveCmd.Overwrite,
User: req.User,
}
savedDashboard, err := s.dashboardService.ImportDashboard(ctx, dto)
if err != nil {
return nil, err
}
err = s.libraryPanelService.ImportLibraryPanelsForDashboard(ctx, req.User, savedDashboard, req.FolderId)
if err != nil {
return nil, err
}
err = s.libraryPanelService.ConnectLibraryPanelsForDashboard(ctx, req.User, savedDashboard)
if err != nil {
return nil, err
}
return &dashboardimport.ImportDashboardResponse{
UID: savedDashboard.Uid,
PluginId: req.PluginId,
Title: savedDashboard.Title,
Path: req.Path,
Revision: savedDashboard.Data.Get("revision").MustInt64(1),
FolderId: savedDashboard.FolderId,
ImportedUri: "db/" + savedDashboard.Slug,
ImportedUrl: savedDashboard.GetUrl(),
ImportedRevision: savedDashboard.Data.Get("revision").MustInt64(1),
Imported: true,
DashboardId: savedDashboard.Id,
Slug: savedDashboard.Slug,
}, nil
}