mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: Move SearchOrgs to org service (#55416)
* Chore: Move SearchOrgs to org service * Fix lint * Fix lint 2
This commit is contained in:
@@ -12,9 +12,9 @@ import (
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/dashboardsnapshots"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/org"
|
||||
"github.com/grafana/grafana/pkg/services/playlist"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
)
|
||||
@@ -27,6 +27,7 @@ type gitExportJob struct {
|
||||
dashboardsnapshotsService dashboardsnapshots.Service
|
||||
datasourceService datasources.DataSourceService
|
||||
playlistService playlist.Service
|
||||
orgService org.Service
|
||||
rootDir string
|
||||
|
||||
statusMu sync.Mutex
|
||||
@@ -38,13 +39,15 @@ type gitExportJob struct {
|
||||
|
||||
func startGitExportJob(cfg ExportConfig, sql *sqlstore.SQLStore,
|
||||
dashboardsnapshotsService dashboardsnapshots.Service, rootDir string, orgID int64,
|
||||
broadcaster statusBroadcaster, playlistService playlist.Service, datasourceService datasources.DataSourceService) (Job, error) {
|
||||
broadcaster statusBroadcaster, playlistService playlist.Service, orgService org.Service,
|
||||
datasourceService datasources.DataSourceService) (Job, error) {
|
||||
job := &gitExportJob{
|
||||
logger: log.New("git_export_job"),
|
||||
cfg: cfg,
|
||||
sql: sql,
|
||||
dashboardsnapshotsService: dashboardsnapshotsService,
|
||||
playlistService: playlistService,
|
||||
orgService: orgService,
|
||||
datasourceService: datasourceService,
|
||||
rootDir: rootDir,
|
||||
broadcaster: broadcaster,
|
||||
@@ -142,19 +145,19 @@ func (e *gitExportJob) doExportWithHistory() error {
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &models.SearchOrgsQuery{}
|
||||
err = e.sql.SearchOrgs(e.helper.ctx, cmd)
|
||||
cmd := &org.SearchOrgsQuery{}
|
||||
result, err := e.orgService.Search(e.helper.ctx, cmd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Export each org
|
||||
for _, org := range cmd.Result {
|
||||
if len(cmd.Result) > 1 {
|
||||
e.helper.orgDir = path.Join(e.rootDir, fmt.Sprintf("org_%d", org.Id))
|
||||
for _, org := range result {
|
||||
if len(result) > 1 {
|
||||
e.helper.orgDir = path.Join(e.rootDir, fmt.Sprintf("org_%d", org.ID))
|
||||
e.status.Count["orgs"] += 1
|
||||
}
|
||||
err = e.helper.initOrg(e.sql, org.Id)
|
||||
err = e.helper.initOrg(e.sql, org.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/live"
|
||||
"github.com/grafana/grafana/pkg/services/org"
|
||||
"github.com/grafana/grafana/pkg/services/playlist"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
@@ -153,6 +154,7 @@ type StandardExport struct {
|
||||
sql *sqlstore.SQLStore
|
||||
dashboardsnapshotsService dashboardsnapshots.Service
|
||||
playlistService playlist.Service
|
||||
orgService org.Service
|
||||
datasourceService datasources.DataSourceService
|
||||
|
||||
// updated with mutex
|
||||
@@ -160,7 +162,8 @@ type StandardExport struct {
|
||||
}
|
||||
|
||||
func ProvideService(sql *sqlstore.SQLStore, features featuremgmt.FeatureToggles, gl *live.GrafanaLive, cfg *setting.Cfg,
|
||||
dashboardsnapshotsService dashboardsnapshots.Service, playlistService playlist.Service, datasourceService datasources.DataSourceService) ExportService {
|
||||
dashboardsnapshotsService dashboardsnapshots.Service, playlistService playlist.Service, orgService org.Service,
|
||||
datasourceService datasources.DataSourceService) ExportService {
|
||||
if !features.IsEnabled(featuremgmt.FlagExport) {
|
||||
return &StubExport{}
|
||||
}
|
||||
@@ -171,6 +174,7 @@ func ProvideService(sql *sqlstore.SQLStore, features featuremgmt.FeatureToggles,
|
||||
logger: log.New("export_service"),
|
||||
dashboardsnapshotsService: dashboardsnapshotsService,
|
||||
playlistService: playlistService,
|
||||
orgService: orgService,
|
||||
datasourceService: datasourceService,
|
||||
exportJob: &stoppedJob{},
|
||||
dataDir: cfg.DataPath,
|
||||
@@ -228,7 +232,7 @@ func (ex *StandardExport) HandleRequestExport(c *models.ReqContext) response.Res
|
||||
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
|
||||
return response.Error(http.StatusBadRequest, "Error creating export folder", nil)
|
||||
}
|
||||
job, err = startGitExportJob(cfg, ex.sql, ex.dashboardsnapshotsService, dir, c.OrgID, broadcast, ex.playlistService, ex.datasourceService)
|
||||
job, err = startGitExportJob(cfg, ex.sql, ex.dashboardsnapshotsService, dir, c.OrgID, broadcast, ex.playlistService, ex.orgService, ex.datasourceService)
|
||||
default:
|
||||
return response.Error(http.StatusBadRequest, "Unsupported job format", nil)
|
||||
}
|
||||
|
||||
@@ -76,7 +76,8 @@ func ProvideService(plugCtxProvider *plugincontext.Provider, cfg *setting.Cfg, r
|
||||
pluginStore plugins.Store, cacheService *localcache.CacheService,
|
||||
dataSourceCache datasources.CacheService, sqlStore *sqlstore.SQLStore, secretsService secrets.Service,
|
||||
usageStatsService usagestats.Service, queryDataService *query.Service, toggles featuremgmt.FeatureToggles,
|
||||
accessControl accesscontrol.AccessControl, dashboardService dashboards.DashboardService, annotationsRepo annotations.Repository) (*GrafanaLive, error) {
|
||||
accessControl accesscontrol.AccessControl, dashboardService dashboards.DashboardService, annotationsRepo annotations.Repository,
|
||||
orgService org.Service) (*GrafanaLive, error) {
|
||||
g := &GrafanaLive{
|
||||
Cfg: cfg,
|
||||
Features: toggles,
|
||||
@@ -93,6 +94,7 @@ func ProvideService(plugCtxProvider *plugincontext.Provider, cfg *setting.Cfg, r
|
||||
Features: make(map[string]models.ChannelHandlerFactory),
|
||||
},
|
||||
usageStatsService: usageStatsService,
|
||||
orgService: orgService,
|
||||
}
|
||||
|
||||
logger.Debug("GrafanaLive initialization", "ha", g.IsHA())
|
||||
@@ -213,16 +215,16 @@ func ProvideService(plugCtxProvider *plugincontext.Provider, cfg *setting.Cfg, r
|
||||
// Pre-build/validate channel rules for all organizations on start.
|
||||
// This can be unreasonable to have in production scenario with many
|
||||
// organizations.
|
||||
orgQuery := &models.SearchOrgsQuery{}
|
||||
orgQuery := &org.SearchOrgsQuery{}
|
||||
|
||||
err := sqlStore.SearchOrgs(context.Background(), orgQuery)
|
||||
result, err := orgService.Search(context.Background(), orgQuery)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("can't get org list: %w", err)
|
||||
}
|
||||
for _, org := range orgQuery.Result {
|
||||
_, _, err := channelRuleGetter.Get(org.Id, "")
|
||||
for _, org := range result {
|
||||
_, _, err := channelRuleGetter.Get(org.ID, "")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error building channel rules for org %d: %w", org.Id, err)
|
||||
return nil, fmt.Errorf("error building channel rules for org %d: %w", org.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -413,6 +415,7 @@ type GrafanaLive struct {
|
||||
SecretsService secrets.Service
|
||||
pluginStore plugins.Store
|
||||
queryDataService *query.Service
|
||||
orgService org.Service
|
||||
|
||||
node *centrifuge.Node
|
||||
surveyCaller *survey.Caller
|
||||
|
||||
@@ -76,6 +76,19 @@ type UpdateOrgCommand struct {
|
||||
OrgId int64
|
||||
}
|
||||
|
||||
type SearchOrgsQuery struct {
|
||||
Query string
|
||||
Name string
|
||||
Limit int
|
||||
Page int
|
||||
IDs []int64
|
||||
}
|
||||
|
||||
type OrgDTO struct {
|
||||
ID int64 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
func (r RoleType) IsValid() bool {
|
||||
return r == RoleViewer || r == RoleAdmin || r == RoleEditor
|
||||
}
|
||||
|
||||
@@ -9,5 +9,6 @@ type Service interface {
|
||||
InsertOrgUser(context.Context, *OrgUser) (int64, error)
|
||||
DeleteUserFromAll(context.Context, int64) error
|
||||
GetUserOrgList(context.Context, *GetUserOrgListQuery) ([]*UserOrgDTO, error)
|
||||
UpdateOrg(ctx context.Context, cmd *UpdateOrgCommand) error
|
||||
UpdateOrg(context.Context, *UpdateOrgCommand) error
|
||||
Search(context.Context, *SearchOrgsQuery) ([]*OrgDTO, error)
|
||||
}
|
||||
|
||||
@@ -108,3 +108,27 @@ func (s *Service) GetUserOrgList(ctx context.Context, query *org.GetUserOrgListQ
|
||||
func (s *Service) UpdateOrg(ctx context.Context, cmd *org.UpdateOrgCommand) error {
|
||||
return s.store.Update(ctx, cmd)
|
||||
}
|
||||
|
||||
// TODO: remove wrapper around sqlstore
|
||||
func (s *Service) Search(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error) {
|
||||
var res []*org.OrgDTO
|
||||
q := &models.SearchOrgsQuery{
|
||||
Query: query.Query,
|
||||
Name: query.Name,
|
||||
Limit: query.Limit,
|
||||
Page: query.Page,
|
||||
Ids: query.IDs,
|
||||
}
|
||||
err := s.sqlStore.SearchOrgs(ctx, q)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, r := range q.Result {
|
||||
res = append(res, &org.OrgDTO{
|
||||
ID: r.Id,
|
||||
Name: r.Name,
|
||||
})
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ type FakeOrgService struct {
|
||||
ExpectedOrgUserID int64
|
||||
ExpectedError error
|
||||
ExpectedUserOrgDTO []*org.UserOrgDTO
|
||||
ExpectedOrgs []*org.OrgDTO
|
||||
}
|
||||
|
||||
func NewOrgServiceFake() *FakeOrgService {
|
||||
@@ -39,3 +40,7 @@ func (f *FakeOrgService) GetUserOrgList(ctx context.Context, query *org.GetUserO
|
||||
func (f *FakeOrgService) UpdateOrg(ctx context.Context, cmd *org.UpdateOrgCommand) error {
|
||||
return f.ExpectedError
|
||||
}
|
||||
|
||||
func (f *FakeOrgService) Search(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error) {
|
||||
return f.ExpectedOrgs, f.ExpectedError
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ var (
|
||||
)
|
||||
|
||||
func service(t *testing.T) *StandardSearchService {
|
||||
service, ok := ProvideService(nil, nil, nil, accesscontrolmock.New()).(*StandardSearchService)
|
||||
service, ok := ProvideService(nil, nil, nil, accesscontrolmock.New(), nil).(*StandardSearchService)
|
||||
require.True(t, ok)
|
||||
return service
|
||||
}
|
||||
|
||||
@@ -53,10 +53,11 @@ var (
|
||||
type StandardSearchService struct {
|
||||
registry.BackgroundService
|
||||
|
||||
cfg *setting.Cfg
|
||||
sql *sqlstore.SQLStore
|
||||
auth FutureAuthService // eventually injected from elsewhere
|
||||
ac accesscontrol.Service
|
||||
cfg *setting.Cfg
|
||||
sql *sqlstore.SQLStore
|
||||
auth FutureAuthService // eventually injected from elsewhere
|
||||
ac accesscontrol.Service
|
||||
orgService org.Service
|
||||
|
||||
logger log.Logger
|
||||
dashboardIndex *searchIndex
|
||||
@@ -68,7 +69,8 @@ func (s *StandardSearchService) IsReady(ctx context.Context, orgId int64) IsSear
|
||||
return s.dashboardIndex.isInitialized(ctx, orgId)
|
||||
}
|
||||
|
||||
func ProvideService(cfg *setting.Cfg, sql *sqlstore.SQLStore, entityEventStore store.EntityEventsService, ac accesscontrol.Service) SearchService {
|
||||
func ProvideService(cfg *setting.Cfg, sql *sqlstore.SQLStore, entityEventStore store.EntityEventsService,
|
||||
ac accesscontrol.Service, orgService org.Service) SearchService {
|
||||
extender := &NoopExtender{}
|
||||
s := &StandardSearchService{
|
||||
cfg: cfg,
|
||||
@@ -84,9 +86,10 @@ func ProvideService(cfg *setting.Cfg, sql *sqlstore.SQLStore, entityEventStore s
|
||||
extender.GetDocumentExtender(),
|
||||
newFolderIDLookup(sql),
|
||||
),
|
||||
logger: log.New("searchV2"),
|
||||
extender: extender,
|
||||
reIndexCh: make(chan struct{}, 1),
|
||||
logger: log.New("searchV2"),
|
||||
extender: extender,
|
||||
reIndexCh: make(chan struct{}, 1),
|
||||
orgService: orgService,
|
||||
}
|
||||
return s
|
||||
}
|
||||
@@ -99,14 +102,14 @@ func (s *StandardSearchService) IsDisabled() bool {
|
||||
}
|
||||
|
||||
func (s *StandardSearchService) Run(ctx context.Context) error {
|
||||
orgQuery := &models.SearchOrgsQuery{}
|
||||
err := s.sql.SearchOrgs(ctx, orgQuery)
|
||||
orgQuery := &org.SearchOrgsQuery{}
|
||||
result, err := s.orgService.Search(ctx, orgQuery)
|
||||
if err != nil {
|
||||
return fmt.Errorf("can't get org list: %w", err)
|
||||
}
|
||||
orgIDs := make([]int64, 0, len(orgQuery.Result))
|
||||
for _, org := range orgQuery.Result {
|
||||
orgIDs = append(orgIDs, org.Id)
|
||||
orgIDs := make([]int64, 0, len(result))
|
||||
for _, org := range result {
|
||||
orgIDs = append(orgIDs, org.ID)
|
||||
}
|
||||
return s.dashboardIndex.run(ctx, orgIDs, s.reIndexCh)
|
||||
}
|
||||
|
||||
@@ -69,7 +69,6 @@ type Store interface {
|
||||
GetTempUserByCode(ctx context.Context, query *models.GetTempUserByCodeQuery) error
|
||||
ExpireOldUserInvites(ctx context.Context, cmd *models.ExpireTempUsersCommand) error
|
||||
GetDBHealthQuery(ctx context.Context, query *models.GetDBHealthQuery) error
|
||||
SearchOrgs(ctx context.Context, query *models.SearchOrgsQuery) error
|
||||
IsAdminOfTeams(ctx context.Context, query *models.IsAdminOfTeamsQuery) error
|
||||
GetSqlxSession() *session.SessionDB
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"strconv"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/org"
|
||||
"github.com/grafana/grafana/pkg/services/serviceaccounts"
|
||||
"github.com/grafana/grafana/pkg/services/serviceaccounts/database"
|
||||
@@ -17,7 +16,8 @@ type CrawlerAuthSetupService interface {
|
||||
Setup(ctx context.Context) (CrawlerAuth, error)
|
||||
}
|
||||
|
||||
func ProvideCrawlerAuthSetupService(serviceAccounts serviceaccounts.Service, serviceAccountsStore serviceaccounts.Store, sqlStore *sqlstore.SQLStore) *OSSCrawlerAuthSetupService {
|
||||
func ProvideCrawlerAuthSetupService(serviceAccounts serviceaccounts.Service, serviceAccountsStore serviceaccounts.Store,
|
||||
sqlStore *sqlstore.SQLStore, orgService org.Service) *OSSCrawlerAuthSetupService {
|
||||
return &OSSCrawlerAuthSetupService{
|
||||
serviceAccountNamePrefix: "dashboard-previews-crawler-org-",
|
||||
serviceAccounts: serviceAccounts,
|
||||
@@ -33,6 +33,7 @@ type OSSCrawlerAuthSetupService struct {
|
||||
serviceAccounts serviceaccounts.Service
|
||||
serviceAccountsStore serviceaccounts.Store
|
||||
sqlStore *sqlstore.SQLStore
|
||||
orgService org.Service
|
||||
}
|
||||
|
||||
type CrawlerAuth interface {
|
||||
@@ -42,15 +43,16 @@ type CrawlerAuth interface {
|
||||
}
|
||||
|
||||
func (o *OSSCrawlerAuthSetupService) findAllOrgIds(ctx context.Context) ([]int64, error) {
|
||||
searchAllOrgsQuery := &models.SearchOrgsQuery{}
|
||||
if err := o.sqlStore.SearchOrgs(ctx, searchAllOrgsQuery); err != nil {
|
||||
searchAllOrgsQuery := &org.SearchOrgsQuery{}
|
||||
result, err := o.orgService.Search(ctx, searchAllOrgsQuery)
|
||||
if err != nil {
|
||||
o.log.Error("Error when searching for orgs", "err", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
orgIds := make([]int64, 0)
|
||||
for i := range searchAllOrgsQuery.Result {
|
||||
orgIds = append(orgIds, searchAllOrgsQuery.Result[i].Id)
|
||||
for i := range result {
|
||||
orgIds = append(orgIds, result[i].ID)
|
||||
}
|
||||
|
||||
return orgIds, nil
|
||||
|
||||
Reference in New Issue
Block a user