mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Dashboard Extractor: Don't fail when using default OSS implementation (#46024)
* Don't fail when using default OSS implementation * Check correct error
This commit is contained in:
parent
8e08128f83
commit
5eaf6509c0
@ -9,11 +9,12 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/services/datasources/permissions"
|
||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana/pkg/api/datasource"
|
"github.com/grafana/grafana/pkg/api/datasource"
|
||||||
"github.com/grafana/grafana/pkg/api/dtos"
|
"github.com/grafana/grafana/pkg/api/dtos"
|
||||||
"github.com/grafana/grafana/pkg/api/response"
|
"github.com/grafana/grafana/pkg/api/response"
|
||||||
"github.com/grafana/grafana/pkg/bus"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/plugins/adapters"
|
"github.com/grafana/grafana/pkg/plugins/adapters"
|
||||||
@ -577,7 +578,7 @@ func (hs *HTTPServer) filterDatasourcesByQueryPermission(ctx context.Context, us
|
|||||||
query.Result = datasources
|
query.Result = datasources
|
||||||
|
|
||||||
if err := hs.DatasourcePermissionsService.FilterDatasourcesBasedOnQueryPermissions(ctx, &query); err != nil {
|
if err := hs.DatasourcePermissionsService.FilterDatasourcesBasedOnQueryPermissions(ctx, &query); err != nil {
|
||||||
if !errors.Is(err, bus.ErrHandlerNotFound) {
|
if !errors.Is(err, permissions.ErrNotImplemented) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return datasources, nil
|
return datasources, nil
|
||||||
|
@ -212,9 +212,10 @@ func (e *DashAlertExtractorService) getAlertFromPanels(ctx context.Context, json
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := e.datasourcePermissionsService.FilterDatasourcesBasedOnQueryPermissions(ctx, &dsFilterQuery); err != nil {
|
if err := e.datasourcePermissionsService.FilterDatasourcesBasedOnQueryPermissions(ctx, &dsFilterQuery); err != nil {
|
||||||
|
if !errors.Is(err, permissions.ErrNotImplemented) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(dsFilterQuery.Result) == 0 {
|
} else if len(dsFilterQuery.Result) == 0 {
|
||||||
return nil, models.ErrDataSourceAccessDenied
|
return nil, models.ErrDataSourceAccessDenied
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package alerting
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -11,6 +12,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources/permissions"
|
"github.com/grafana/grafana/pkg/services/datasources/permissions"
|
||||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -295,6 +297,69 @@ func TestAlertRuleExtraction(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFilterPermissionsErrors(t *testing.T) {
|
||||||
|
RegisterCondition("query", func(model *simplejson.Json, index int) (Condition, error) {
|
||||||
|
return &FakeCondition{}, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
// mock data
|
||||||
|
defaultDs := &models.DataSource{Id: 12, OrgId: 1, Name: "I am default", IsDefault: true, Uid: "def-uid"}
|
||||||
|
|
||||||
|
json, err := ioutil.ReadFile("./testdata/graphite-alert.json")
|
||||||
|
require.Nil(t, err)
|
||||||
|
dashJSON, err := simplejson.NewJson(json)
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
dsPermissions := permissions.NewMockDatasourcePermissionService()
|
||||||
|
dsService := &fakeDatasourceService{ExpectedDatasource: defaultDs}
|
||||||
|
extractor := ProvideDashAlertExtractorService(dsPermissions, dsService)
|
||||||
|
|
||||||
|
tc := []struct {
|
||||||
|
name string
|
||||||
|
result []*models.DataSource
|
||||||
|
err error
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"Data sources are filtered and return results don't return an error",
|
||||||
|
[]*models.DataSource{defaultDs},
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Data sources are filtered but return empty results should return error",
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
models.ErrDataSourceAccessDenied,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Using default OSS implementation doesn't return an error",
|
||||||
|
nil,
|
||||||
|
permissions.ErrNotImplemented,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Returning an error different from ErrNotImplemented should fails",
|
||||||
|
nil,
|
||||||
|
errors.New("random error"),
|
||||||
|
errors.New("random error"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tc {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
dsPermissions.DsResult = test.result
|
||||||
|
dsPermissions.ErrResult = test.err
|
||||||
|
_, err = extractor.GetAlerts(WithUAEnabled(context.Background(), true), DashAlertInfo{
|
||||||
|
User: nil,
|
||||||
|
Dash: models.NewDashboardFromJson(dashJSON),
|
||||||
|
OrgID: 1,
|
||||||
|
})
|
||||||
|
assert.Equal(t, err, test.expectedErr)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type fakeDatasourceService struct {
|
type fakeDatasourceService struct {
|
||||||
ExpectedDatasource *models.DataSource
|
ExpectedDatasource *models.DataSource
|
||||||
datasources.DataSourceService
|
datasources.DataSourceService
|
||||||
|
@ -2,17 +2,20 @@ package permissions
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ErrNotImplemented = errors.New("not implemented")
|
||||||
|
|
||||||
type DatasourcePermissionsService interface {
|
type DatasourcePermissionsService interface {
|
||||||
FilterDatasourcesBasedOnQueryPermissions(ctx context.Context, cmd *models.DatasourcesPermissionFilterQuery) error
|
FilterDatasourcesBasedOnQueryPermissions(ctx context.Context, cmd *models.DatasourcesPermissionFilterQuery) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// dummy method
|
// dummy method
|
||||||
func (hs *OSSDatasourcePermissionsService) FilterDatasourcesBasedOnQueryPermissions(ctx context.Context, cmd *models.DatasourcesPermissionFilterQuery) error {
|
func (hs *OSSDatasourcePermissionsService) FilterDatasourcesBasedOnQueryPermissions(ctx context.Context, cmd *models.DatasourcesPermissionFilterQuery) error {
|
||||||
return nil
|
return ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
type OSSDatasourcePermissionsService struct{}
|
type OSSDatasourcePermissionsService struct{}
|
||||||
|
@ -8,11 +8,12 @@ import (
|
|||||||
|
|
||||||
type mockDatasourcePermissionService struct {
|
type mockDatasourcePermissionService struct {
|
||||||
DsResult []*models.DataSource
|
DsResult []*models.DataSource
|
||||||
|
ErrResult error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockDatasourcePermissionService) FilterDatasourcesBasedOnQueryPermissions(ctx context.Context, cmd *models.DatasourcesPermissionFilterQuery) error {
|
func (m *mockDatasourcePermissionService) FilterDatasourcesBasedOnQueryPermissions(ctx context.Context, cmd *models.DatasourcesPermissionFilterQuery) error {
|
||||||
cmd.Result = m.DsResult
|
cmd.Result = m.DsResult
|
||||||
return nil
|
return m.ErrResult
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMockDatasourcePermissionService() *mockDatasourcePermissionService {
|
func NewMockDatasourcePermissionService() *mockDatasourcePermissionService {
|
||||||
|
Loading…
Reference in New Issue
Block a user