backend/datasources: move datasources models into the datasources service package (#51267)
* backend/datasources: move datasources models into the datasources service pkg
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol/resourcepermissions/types"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
)
|
||||
|
||||
@@ -75,11 +76,11 @@ func setupResourceBenchmark(b *testing.B, dsNum, usersNum int) (*AccessControlSt
|
||||
func GenerateDatasourcePermissions(b *testing.B, db *sqlstore.SQLStore, ac *AccessControlStore, dsNum, usersNum, permissionsPerDs int) []int64 {
|
||||
dataSources := make([]int64, 0)
|
||||
for i := 0; i < dsNum; i++ {
|
||||
addDSCommand := &models.AddDataSourceCommand{
|
||||
addDSCommand := &datasources.AddDataSourceCommand{
|
||||
OrgId: 0,
|
||||
Name: fmt.Sprintf("ds_%d", i),
|
||||
Type: models.DS_GRAPHITE,
|
||||
Access: models.DS_ACCESS_DIRECT,
|
||||
Type: datasources.DS_GRAPHITE,
|
||||
Access: datasources.DS_ACCESS_DIRECT,
|
||||
Url: "http://test",
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
)
|
||||
|
||||
@@ -39,7 +40,7 @@ func benchmarkFilter(b *testing.B, numDs, numPermissions int) {
|
||||
)
|
||||
require.NoError(b, err)
|
||||
|
||||
var datasources []models.DataSource
|
||||
var datasources []datasources.DataSource
|
||||
sess := store.NewSession(context.Background())
|
||||
err = sess.SQL(baseSql+acFilter.Where, acFilter.Args...).Find(&datasources)
|
||||
require.NoError(b, err)
|
||||
@@ -53,7 +54,7 @@ func setupFilterBenchmark(b *testing.B, numDs, numPermissions int) (*sqlstore.SQ
|
||||
store := sqlstore.InitTestDB(b)
|
||||
|
||||
for i := 1; i <= numDs; i++ {
|
||||
err := store.AddDataSource(context.Background(), &models.AddDataSourceCommand{
|
||||
err := store.AddDataSource(context.Background(), &datasources.AddDataSourceCommand{
|
||||
Name: fmt.Sprintf("ds:%d", i),
|
||||
OrgId: 1,
|
||||
})
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
)
|
||||
|
||||
@@ -170,7 +171,7 @@ func TestFilter_Datasources(t *testing.T) {
|
||||
|
||||
// seed 10 data sources
|
||||
for i := 1; i <= 10; i++ {
|
||||
err := store.AddDataSource(context.Background(), &models.AddDataSourceCommand{Name: fmt.Sprintf("ds:%d", i), Uid: fmt.Sprintf("uid%d", i)})
|
||||
err := store.AddDataSource(context.Background(), &datasources.AddDataSourceCommand{Name: fmt.Sprintf("ds:%d", i), Uid: fmt.Sprintf("uid%d", i)})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -187,7 +188,7 @@ func TestFilter_Datasources(t *testing.T) {
|
||||
|
||||
if !tt.expectErr {
|
||||
require.NoError(t, err)
|
||||
var datasources []models.DataSource
|
||||
var datasources []datasources.DataSource
|
||||
err = sess.SQL(baseSql+acFilter.Where, acFilter.Args...).Find(&datasources)
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@@ -1,40 +1,43 @@
|
||||
package accesscontrol
|
||||
package accesscontrol_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
)
|
||||
|
||||
func TestResolveKeywordScope(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
user *models.SignedInUser
|
||||
permission Permission
|
||||
want Permission
|
||||
permission accesscontrol.Permission
|
||||
want accesscontrol.Permission
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "no scope",
|
||||
user: testUser,
|
||||
permission: Permission{Action: "users:read"},
|
||||
want: Permission{Action: "users:read"},
|
||||
permission: accesscontrol.Permission{Action: "users:read"},
|
||||
want: accesscontrol.Permission{Action: "users:read"},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "user if resolution",
|
||||
user: testUser,
|
||||
permission: Permission{Action: "users:read", Scope: "users:self"},
|
||||
want: Permission{Action: "users:read", Scope: "users:id:2"},
|
||||
permission: accesscontrol.Permission{Action: "users:read", Scope: "users:self"},
|
||||
want: accesscontrol.Permission{Action: "users:read", Scope: "users:id:2"},
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
var err error
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
resolvers := NewScopeResolvers()
|
||||
resolvers := accesscontrol.NewScopeResolvers()
|
||||
scopeModifier := resolvers.GetScopeKeywordMutator(tt.user)
|
||||
tt.permission.Scope, err = scopeModifier(context.TODO(), tt.permission.Scope)
|
||||
if tt.wantErr {
|
||||
@@ -60,64 +63,64 @@ var testUser = &models.SignedInUser{
|
||||
func TestResolveAttributeScope(t *testing.T) {
|
||||
// Calls allow us to see how many times the fakeDataSourceResolution has been called
|
||||
calls := 0
|
||||
fakeDataSourceResolver := ScopeAttributeResolverFunc(func(ctx context.Context, orgID int64, initialScope string) ([]string, error) {
|
||||
fakeDataSourceResolver := accesscontrol.ScopeAttributeResolverFunc(func(ctx context.Context, orgID int64, initialScope string) ([]string, error) {
|
||||
calls++
|
||||
if initialScope == "datasources:name:testds" {
|
||||
return []string{Scope("datasources", "id", "1")}, nil
|
||||
return []string{accesscontrol.Scope("datasources", "id", "1")}, nil
|
||||
} else if initialScope == "datasources:name:testds2" {
|
||||
return []string{Scope("datasources", "id", "2")}, nil
|
||||
return []string{accesscontrol.Scope("datasources", "id", "2")}, nil
|
||||
} else if initialScope == "datasources:name:test:ds4" {
|
||||
return []string{Scope("datasources", "id", "4")}, nil
|
||||
return []string{accesscontrol.Scope("datasources", "id", "4")}, nil
|
||||
} else if initialScope == "datasources:name:testds5*" {
|
||||
return []string{Scope("datasources", "id", "5")}, nil
|
||||
return []string{accesscontrol.Scope("datasources", "id", "5")}, nil
|
||||
} else {
|
||||
return nil, models.ErrDataSourceNotFound
|
||||
return nil, datasources.ErrDataSourceNotFound
|
||||
}
|
||||
})
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
orgID int64
|
||||
evaluator Evaluator
|
||||
wantEvaluator Evaluator
|
||||
evaluator accesscontrol.Evaluator
|
||||
wantEvaluator accesscontrol.Evaluator
|
||||
wantCalls int
|
||||
wantErr error
|
||||
}{
|
||||
{
|
||||
name: "should work with scope less permissions",
|
||||
evaluator: EvalPermission("datasources:read"),
|
||||
wantEvaluator: EvalPermission("datasources:read"),
|
||||
evaluator: accesscontrol.EvalPermission("datasources:read"),
|
||||
wantEvaluator: accesscontrol.EvalPermission("datasources:read"),
|
||||
wantCalls: 0,
|
||||
},
|
||||
{
|
||||
name: "should handle an error",
|
||||
orgID: 1,
|
||||
evaluator: EvalPermission("datasources:read", Scope("datasources", "name", "testds3")),
|
||||
wantErr: models.ErrDataSourceNotFound,
|
||||
evaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "testds3")),
|
||||
wantErr: datasources.ErrDataSourceNotFound,
|
||||
wantCalls: 1,
|
||||
},
|
||||
{
|
||||
name: "should resolve a scope",
|
||||
orgID: 1,
|
||||
evaluator: EvalPermission("datasources:read", Scope("datasources", "name", "testds")),
|
||||
wantEvaluator: EvalPermission("datasources:read", Scope("datasources", "id", "1")),
|
||||
evaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "testds")),
|
||||
wantEvaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "id", "1")),
|
||||
wantCalls: 1,
|
||||
},
|
||||
{
|
||||
name: "should resolve nested scopes with cache",
|
||||
orgID: 1,
|
||||
evaluator: EvalAll(
|
||||
EvalPermission("datasources:read", Scope("datasources", "name", "testds")),
|
||||
EvalAny(
|
||||
EvalPermission("datasources:read", Scope("datasources", "name", "testds")),
|
||||
EvalPermission("datasources:read", Scope("datasources", "name", "testds2")),
|
||||
evaluator: accesscontrol.EvalAll(
|
||||
accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "testds")),
|
||||
accesscontrol.EvalAny(
|
||||
accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "testds")),
|
||||
accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "testds2")),
|
||||
),
|
||||
),
|
||||
wantEvaluator: EvalAll(
|
||||
EvalPermission("datasources:read", Scope("datasources", "id", "1")),
|
||||
EvalAny(
|
||||
EvalPermission("datasources:read", Scope("datasources", "id", "1")),
|
||||
EvalPermission("datasources:read", Scope("datasources", "id", "2")),
|
||||
wantEvaluator: accesscontrol.EvalAll(
|
||||
accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "id", "1")),
|
||||
accesscontrol.EvalAny(
|
||||
accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "id", "1")),
|
||||
accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "id", "2")),
|
||||
),
|
||||
),
|
||||
wantCalls: 2,
|
||||
@@ -125,20 +128,20 @@ func TestResolveAttributeScope(t *testing.T) {
|
||||
{
|
||||
name: "should resolve name with colon",
|
||||
orgID: 1,
|
||||
evaluator: EvalPermission("datasources:read", Scope("datasources", "name", "test:ds4")),
|
||||
wantEvaluator: EvalPermission("datasources:read", Scope("datasources", "id", "4")),
|
||||
evaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "test:ds4")),
|
||||
wantEvaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "id", "4")),
|
||||
wantCalls: 1,
|
||||
},
|
||||
{
|
||||
name: "should resolve names with '*'",
|
||||
orgID: 1,
|
||||
evaluator: EvalPermission("datasources:read", Scope("datasources", "name", "testds5*")),
|
||||
wantEvaluator: EvalPermission("datasources:read", Scope("datasources", "id", "5")),
|
||||
evaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "name", "testds5*")),
|
||||
wantEvaluator: accesscontrol.EvalPermission("datasources:read", accesscontrol.Scope("datasources", "id", "5")),
|
||||
wantCalls: 1,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
resolvers := NewScopeResolvers()
|
||||
resolvers := accesscontrol.NewScopeResolvers()
|
||||
|
||||
// Reset calls counter
|
||||
calls = 0
|
||||
|
||||
Reference in New Issue
Block a user