From 33359aee6c9d25c6234845c537c5352e1d73e112 Mon Sep 17 00:00:00 2001 From: Kristin Laemmert Date: Thu, 19 May 2022 10:59:12 -0400 Subject: [PATCH] backend/sqlstore: move GetDashboards to Dashboard Service (#49175) I also did some mild file renaming to try and get the dashboards package closer in line with the sqlstore split design doc. --- pkg/api/playlist_play.go | 2 +- pkg/services/dashboards/dashboard.go | 4 +++- .../dashboards/dashboard_service_mock.go | 4 ++++ pkg/services/dashboards/database/database.go | 22 +++++++++++++++++++ .../database/database_provisioning_test.go | 4 ++-- ...ase_dashboard_test.go => database_test.go} | 13 +++++++++++ .../dashboards/service/dashboard_service.go | 4 ++++ .../{database_mock.go => store_mock.go} | 14 ++++++++++++ pkg/services/sqlstore/dashboard.go | 22 ------------------- pkg/services/sqlstore/store.go | 1 - 10 files changed, 63 insertions(+), 27 deletions(-) rename pkg/services/dashboards/database/{database_dashboard_test.go => database_test.go} (97%) rename pkg/services/dashboards/{database_mock.go => store_mock.go} (96%) diff --git a/pkg/api/playlist_play.go b/pkg/api/playlist_play.go index efd07dfab6e..712cffe8ce5 100644 --- a/pkg/api/playlist_play.go +++ b/pkg/api/playlist_play.go @@ -16,7 +16,7 @@ func (hs *HTTPServer) populateDashboardsByID(ctx context.Context, dashboardByIDs if len(dashboardByIDs) > 0 { dashboardQuery := models.GetDashboardsQuery{DashboardIds: dashboardByIDs} - if err := hs.SQLStore.GetDashboards(ctx, &dashboardQuery); err != nil { + if err := hs.dashboardService.GetDashboards(ctx, &dashboardQuery); err != nil { return result, err } diff --git a/pkg/services/dashboards/dashboard.go b/pkg/services/dashboards/dashboard.go index ff1960365d0..78d749636e2 100644 --- a/pkg/services/dashboards/dashboard.go +++ b/pkg/services/dashboards/dashboard.go @@ -18,6 +18,7 @@ type DashboardService interface { BuildSaveDashboardCommand(ctx context.Context, dto *SaveDashboardDTO, shouldValidateAlerts bool, validateProvisionedDashboard bool) (*models.SaveDashboardCommand, error) DeleteDashboard(ctx context.Context, dashboardId int64, orgId int64) error GetDashboard(ctx context.Context, query *models.GetDashboardQuery) error + GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error GetPublicDashboardConfig(ctx context.Context, orgId int64, dashboardUid string) (*models.PublicDashboardConfig, error) ImportDashboard(ctx context.Context, dto *SaveDashboardDTO) (*models.Dashboard, error) @@ -45,13 +46,14 @@ type DashboardProvisioningService interface { UnprovisionDashboard(ctx context.Context, dashboardID int64) error } -//go:generate mockery --name Store --structname FakeDashboardStore --inpackage --filename database_mock.go +//go:generate mockery --name Store --structname FakeDashboardStore --inpackage --filename store_mock.go // Store is a dashboard store. type Store interface { DeleteDashboard(ctx context.Context, cmd *models.DeleteDashboardCommand) error DeleteOrphanedProvisionedDashboards(ctx context.Context, cmd *models.DeleteOrphanedProvisionedDashboardsCommand) error GetDashboard(ctx context.Context, query *models.GetDashboardQuery) error GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error + GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error // GetDashboardsByPluginID retrieves dashboards identified by plugin. GetDashboardsByPluginID(ctx context.Context, query *models.GetDashboardsByPluginIdQuery) error GetProvisionedDashboardData(name string) ([]*models.DashboardProvisioning, error) diff --git a/pkg/services/dashboards/dashboard_service_mock.go b/pkg/services/dashboards/dashboard_service_mock.go index e28b9ea95d7..72a956e96c6 100644 --- a/pkg/services/dashboards/dashboard_service_mock.go +++ b/pkg/services/dashboards/dashboard_service_mock.go @@ -73,3 +73,7 @@ func (s *FakeDashboardService) GetDashboard(ctx context.Context, cmd *models.Get func (s *FakeDashboardService) GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error { return nil } + +func (s *FakeDashboardService) GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error { + return nil +} diff --git a/pkg/services/dashboards/database/database.go b/pkg/services/dashboards/database/database.go index 87beb2bccf0..be20d8a5529 100644 --- a/pkg/services/dashboards/database/database.go +++ b/pkg/services/dashboards/database/database.go @@ -6,6 +6,8 @@ import ( "fmt" "time" + "xorm.io/xorm" + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/metrics" "github.com/grafana/grafana/pkg/models" @@ -904,3 +906,23 @@ func (d *DashboardStore) GetDashboardUIDById(ctx context.Context, query *models. return nil }) } + +func (d *DashboardStore) GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error { + return d.sqlStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error { + if len(query.DashboardIds) == 0 && len(query.DashboardUIds) == 0 { + return models.ErrCommandValidationFailed + } + + var dashboards = make([]*models.Dashboard, 0) + var session *xorm.Session + if len(query.DashboardIds) > 0 { + session = sess.In("id", query.DashboardIds) + } else { + session = sess.In("uid", query.DashboardUIds) + } + + err := session.Find(&dashboards) + query.Result = dashboards + return err + }) +} diff --git a/pkg/services/dashboards/database/database_provisioning_test.go b/pkg/services/dashboards/database/database_provisioning_test.go index ab7104ebcd3..56084413b98 100644 --- a/pkg/services/dashboards/database/database_provisioning_test.go +++ b/pkg/services/dashboards/database/database_provisioning_test.go @@ -78,7 +78,7 @@ func TestDashboardProvisioningTest(t *testing.T) { require.Nil(t, err) query := &models.GetDashboardsQuery{DashboardIds: []int64{anotherDash.Id}} - err = sqlStore.GetDashboards(context.Background(), query) + err = dashboardStore.GetDashboards(context.Background(), query) require.Nil(t, err) require.NotNil(t, query.Result) @@ -86,7 +86,7 @@ func TestDashboardProvisioningTest(t *testing.T) { require.Nil(t, dashboardStore.DeleteOrphanedProvisionedDashboards(context.Background(), deleteCmd)) query = &models.GetDashboardsQuery{DashboardIds: []int64{dash.Id, anotherDash.Id}} - err = sqlStore.GetDashboards(context.Background(), query) + err = dashboardStore.GetDashboards(context.Background(), query) require.Nil(t, err) require.Equal(t, 1, len(query.Result)) diff --git a/pkg/services/dashboards/database/database_dashboard_test.go b/pkg/services/dashboards/database/database_test.go similarity index 97% rename from pkg/services/dashboards/database/database_dashboard_test.go rename to pkg/services/dashboards/database/database_test.go index 1c0443d9c0c..724115b3483 100644 --- a/pkg/services/dashboards/database/database_dashboard_test.go +++ b/pkg/services/dashboards/database/database_test.go @@ -127,6 +127,19 @@ func TestDashboardDataAccess(t *testing.T) { require.Equal(t, err, models.ErrDashboardIdentifierNotSet) }) + t.Run("Should be able to get dashboards by IDs & UIDs", func(t *testing.T) { + setup() + query := models.GetDashboardsQuery{DashboardIds: []int64{savedDash.Id, savedDash2.Id}} + err := dashboardStore.GetDashboards(context.Background(), &query) + require.NoError(t, err) + assert.Equal(t, len(query.Result), 2) + + query = models.GetDashboardsQuery{DashboardUIds: []string{savedDash.Uid, savedDash2.Uid}} + err = dashboardStore.GetDashboards(context.Background(), &query) + require.NoError(t, err) + assert.Equal(t, len(query.Result), 2) + }) + t.Run("Should be able to delete dashboard", func(t *testing.T) { setup() dash := insertTestDashboard(t, dashboardStore, "delete me", 1, 0, false, "delete this") diff --git a/pkg/services/dashboards/service/dashboard_service.go b/pkg/services/dashboards/service/dashboard_service.go index 5dcf891fdc6..2ef1e9ddb48 100644 --- a/pkg/services/dashboards/service/dashboard_service.go +++ b/pkg/services/dashboards/service/dashboard_service.go @@ -518,3 +518,7 @@ func (dr *DashboardServiceImpl) GetDashboard(ctx context.Context, query *models. func (dr *DashboardServiceImpl) GetDashboardUIDById(ctx context.Context, query *models.GetDashboardRefByIdQuery) error { return dr.dashboardStore.GetDashboardUIDById(ctx, query) } + +func (dr *DashboardServiceImpl) GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error { + return dr.dashboardStore.GetDashboards(ctx, query) +} diff --git a/pkg/services/dashboards/database_mock.go b/pkg/services/dashboards/store_mock.go similarity index 96% rename from pkg/services/dashboards/database_mock.go rename to pkg/services/dashboards/store_mock.go index 71dd606e774..35ad8b1afdd 100644 --- a/pkg/services/dashboards/database_mock.go +++ b/pkg/services/dashboards/store_mock.go @@ -72,6 +72,20 @@ func (_m *FakeDashboardStore) GetDashboardUIDById(ctx context.Context, query *mo return r0 } +// GetDashboards provides a mock function with given fields: ctx, query +func (_m *FakeDashboardStore) GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error { + ret := _m.Called(ctx, query) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *models.GetDashboardsQuery) error); ok { + r0 = rf(ctx, query) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // GetDashboardsByPluginID provides a mock function with given fields: ctx, query func (_m *FakeDashboardStore) GetDashboardsByPluginID(ctx context.Context, query *models.GetDashboardsByPluginIdQuery) error { ret := _m.Called(ctx, query) diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go index 7c6ad0ed3df..7f77158e748 100644 --- a/pkg/services/sqlstore/dashboard.go +++ b/pkg/services/sqlstore/dashboard.go @@ -4,8 +4,6 @@ import ( "context" "strings" - "xorm.io/xorm" - "github.com/prometheus/client_golang/prometheus" "github.com/grafana/grafana/pkg/models" @@ -201,26 +199,6 @@ func (ss *SQLStore) GetDashboardTags(ctx context.Context, query *models.GetDashb }) } -func (ss *SQLStore) GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error { - return ss.WithDbSession(ctx, func(dbSession *DBSession) error { - if len(query.DashboardIds) == 0 && len(query.DashboardUIds) == 0 { - return models.ErrCommandValidationFailed - } - - var dashboards = make([]*models.Dashboard, 0) - var session *xorm.Session - if len(query.DashboardIds) > 0 { - session = dbSession.In("id", query.DashboardIds) - } else { - session = dbSession.In("uid", query.DashboardUIds) - } - - err := session.Find(&dashboards) - query.Result = dashboards - return err - }) -} - // GetDashboardPermissionsForUser returns the maximum permission the specified user has for a dashboard(s) // The function takes in a list of dashboard ids and the user id and role func (ss *SQLStore) GetDashboardPermissionsForUser(ctx context.Context, query *models.GetDashboardPermissionsForUserQuery) error { diff --git a/pkg/services/sqlstore/store.go b/pkg/services/sqlstore/store.go index 4238f9d9497..64d5700c30f 100644 --- a/pkg/services/sqlstore/store.go +++ b/pkg/services/sqlstore/store.go @@ -98,7 +98,6 @@ type Store interface { RemoveOrgUser(ctx context.Context, cmd *models.RemoveOrgUserCommand) error GetDashboardTags(ctx context.Context, query *models.GetDashboardTagsQuery) error SearchDashboards(ctx context.Context, query *models.FindPersistedDashboardsQuery) error - GetDashboards(ctx context.Context, query *models.GetDashboardsQuery) error GetDataSource(ctx context.Context, query *models.GetDataSourceQuery) error GetDataSources(ctx context.Context, query *models.GetDataSourcesQuery) error GetDataSourcesByType(ctx context.Context, query *models.GetDataSourcesByTypeQuery) error