[MM-32281] SqlRoleStore/GetByName: add context to allow read from master (#17176)
* role_store/GetByName: add context * propagate context in the app layer * propagate context in the app layer * add missing import Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
9eceeaa8db
Коммит
28ff4dc8d0
@@ -44,7 +44,7 @@ func getMockStore() *mocks.Store {
|
||||
mockRolesStore := mocks.RoleStore{}
|
||||
mockRolesStore.On("Save", &fakeRole).Return(&model.Role{}, nil)
|
||||
mockRolesStore.On("Delete", "123").Return(&fakeRole, nil)
|
||||
mockRolesStore.On("GetByName", "role-name").Return(&fakeRole, nil)
|
||||
mockRolesStore.On("GetByName", context.Background(), "role-name").Return(&fakeRole, nil)
|
||||
mockRolesStore.On("GetByNames", []string{"role-name"}).Return([]*model.Role{&fakeRole}, nil)
|
||||
mockRolesStore.On("PermanentDeleteAll").Return(nil)
|
||||
mockStore.On("Role").Return(&mockRolesStore)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package localcachelayer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
@@ -40,13 +41,13 @@ func (s LocalCacheRoleStore) Save(role *model.Role) (*model.Role, error) {
|
||||
return s.RoleStore.Save(role)
|
||||
}
|
||||
|
||||
func (s LocalCacheRoleStore) GetByName(name string) (*model.Role, error) {
|
||||
func (s LocalCacheRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
|
||||
var role *model.Role
|
||||
if err := s.rootStore.doStandardReadCache(s.rootStore.roleCache, name, &role); err == nil {
|
||||
return role, nil
|
||||
}
|
||||
|
||||
role, err := s.RoleStore.GetByName(name)
|
||||
role, err := s.RoleStore.GetByName(ctx, name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package localcachelayer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -27,13 +28,13 @@ func TestRoleStoreCache(t *testing.T) {
|
||||
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
|
||||
require.NoError(t, err)
|
||||
|
||||
role, err := cachedStore.Role().GetByName("role-name")
|
||||
role, err := cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, role, &fakeRole)
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, role, &fakeRole)
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
|
||||
})
|
||||
|
||||
@@ -43,10 +44,10 @@ func TestRoleStoreCache(t *testing.T) {
|
||||
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
|
||||
require.NoError(t, err)
|
||||
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
|
||||
cachedStore.Role().Save(&fakeRole)
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 2)
|
||||
})
|
||||
|
||||
@@ -56,10 +57,10 @@ func TestRoleStoreCache(t *testing.T) {
|
||||
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
|
||||
require.NoError(t, err)
|
||||
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
|
||||
cachedStore.Role().Delete("123")
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 2)
|
||||
})
|
||||
|
||||
@@ -69,10 +70,10 @@ func TestRoleStoreCache(t *testing.T) {
|
||||
cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
|
||||
require.NoError(t, err)
|
||||
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 1)
|
||||
cachedStore.Role().PermanentDeleteAll()
|
||||
cachedStore.Role().GetByName("role-name")
|
||||
cachedStore.Role().GetByName(context.Background(), "role-name")
|
||||
mockStore.Role().(*mocks.RoleStore).AssertNumberOfCalls(t, "GetByName", 2)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -6559,7 +6559,7 @@ func (s *OpenTracingLayerRoleStore) GetAll() ([]*model.Role, error) {
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerRoleStore) GetByName(name string) (*model.Role, error) {
|
||||
func (s *OpenTracingLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "RoleStore.GetByName")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
@@ -6568,7 +6568,7 @@ func (s *OpenTracingLayerRoleStore) GetByName(name string) (*model.Role, error)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.RoleStore.GetByName(name)
|
||||
result, err := s.RoleStore.GetByName(ctx, name)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
|
||||
@@ -7110,11 +7110,11 @@ func (s *RetryLayerRoleStore) GetAll() ([]*model.Role, error) {
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerRoleStore) GetByName(name string) (*model.Role, error) {
|
||||
func (s *RetryLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.RoleStore.GetByName(name)
|
||||
result, err := s.RoleStore.GetByName(ctx, name)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package sqlstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"strings"
|
||||
@@ -175,10 +176,9 @@ func (s *SqlRoleStore) GetAll() ([]*model.Role, error) {
|
||||
return roles, nil
|
||||
}
|
||||
|
||||
func (s *SqlRoleStore) GetByName(name string) (*model.Role, error) {
|
||||
func (s *SqlRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
|
||||
var dbRole Role
|
||||
|
||||
if err := s.GetReplica().SelectOne(&dbRole, "SELECT * from Roles WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
|
||||
if err := s.DBFromContext(ctx).SelectOne(&dbRole, "SELECT * from Roles WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, store.NewErrNotFound("Role", fmt.Sprintf("name=%s", name))
|
||||
}
|
||||
|
||||
@@ -269,7 +269,7 @@ func (s *SqlSchemeStore) GetByName(schemeName string) (*model.Scheme, error) {
|
||||
func (s *SqlSchemeStore) Delete(schemeId string) (*model.Scheme, error) {
|
||||
// Get the scheme
|
||||
var scheme model.Scheme
|
||||
if err := s.GetReplica().SelectOne(&scheme, "SELECT * from Schemes WHERE Id = :Id", map[string]interface{}{"Id": schemeId}); err != nil {
|
||||
if err := s.GetMaster().SelectOne(&scheme, "SELECT * from Schemes WHERE Id = :Id", map[string]interface{}{"Id": schemeId}); err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, store.NewErrNotFound("Scheme", fmt.Sprintf("schemeId=%s", schemeId))
|
||||
}
|
||||
|
||||
@@ -686,7 +686,7 @@ type RoleStore interface {
|
||||
Save(role *model.Role) (*model.Role, error)
|
||||
Get(roleID string) (*model.Role, error)
|
||||
GetAll() ([]*model.Role, error)
|
||||
GetByName(name string) (*model.Role, error)
|
||||
GetByName(ctx context.Context, name string) (*model.Role, error)
|
||||
GetByNames(names []string) ([]*model.Role, error)
|
||||
Delete(roleID string) (*model.Role, error)
|
||||
PermanentDeleteAll() error
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
package mocks
|
||||
|
||||
import (
|
||||
context "context"
|
||||
|
||||
model "github.com/mattermost/mattermost-server/v5/model"
|
||||
mock "github.com/stretchr/testify/mock"
|
||||
)
|
||||
@@ -152,13 +154,13 @@ func (_m *RoleStore) GetAll() ([]*model.Role, error) {
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetByName provides a mock function with given fields: name
|
||||
func (_m *RoleStore) GetByName(name string) (*model.Role, error) {
|
||||
ret := _m.Called(name)
|
||||
// GetByName provides a mock function with given fields: ctx, name
|
||||
func (_m *RoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
|
||||
ret := _m.Called(ctx, name)
|
||||
|
||||
var r0 *model.Role
|
||||
if rf, ok := ret.Get(0).(func(string) *model.Role); ok {
|
||||
r0 = rf(name)
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string) *model.Role); ok {
|
||||
r0 = rf(ctx, name)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*model.Role)
|
||||
@@ -166,8 +168,8 @@ func (_m *RoleStore) GetByName(name string) (*model.Role, error) {
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
||||
r1 = rf(name)
|
||||
if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
|
||||
r1 = rf(ctx, name)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package storetest
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
@@ -191,7 +192,7 @@ func testRoleStoreGetByName(t *testing.T, ss store.Store) {
|
||||
assert.Len(t, d1.Id, 26)
|
||||
|
||||
// Get a valid role
|
||||
d2, err := ss.Role().GetByName(d1.Name)
|
||||
d2, err := ss.Role().GetByName(context.Background(), d1.Name)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, d1.Id, d2.Id)
|
||||
assert.Equal(t, r1.Name, d2.Name)
|
||||
@@ -201,7 +202,7 @@ func testRoleStoreGetByName(t *testing.T, ss store.Store) {
|
||||
assert.Equal(t, r1.SchemeManaged, d2.SchemeManaged)
|
||||
|
||||
// Get an invalid role
|
||||
_, err = ss.Role().GetByName(model.NewId())
|
||||
_, err = ss.Role().GetByName(context.Background(), model.NewId())
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
@@ -309,7 +310,7 @@ func testRoleStoreDelete(t *testing.T, ss store.Store) {
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, d2.DeleteAt)
|
||||
|
||||
d3, err := ss.Role().GetByName(d1.Name)
|
||||
d3, err := ss.Role().GetByName(context.Background(), d1.Name)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, d3.DeleteAt)
|
||||
|
||||
@@ -559,13 +560,13 @@ func testRoleStoreChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest(t *t
|
||||
require.NoError(t, nErr)
|
||||
defer ss.Channel().Delete(channel.Id, 0)
|
||||
|
||||
channelSchemeUserRole, err := ss.Role().GetByName(channelScheme.DefaultChannelUserRole)
|
||||
channelSchemeUserRole, err := ss.Role().GetByName(context.Background(), channelScheme.DefaultChannelUserRole)
|
||||
require.NoError(t, err)
|
||||
channelSchemeUserRole.Permissions = []string{}
|
||||
_, err = ss.Role().Save(channelSchemeUserRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
teamSchemeUserRole, err := ss.Role().GetByName(teamScheme.DefaultChannelUserRole)
|
||||
teamSchemeUserRole, err := ss.Role().GetByName(context.Background(), teamScheme.DefaultChannelUserRole)
|
||||
require.NoError(t, err)
|
||||
teamSchemeUserRole.Permissions = []string{model.PERMISSION_UPLOAD_FILE.Id}
|
||||
_, err = ss.Role().Save(teamSchemeUserRole)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package storetest
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -108,32 +109,32 @@ func testSchemeStoreSave(t *testing.T, ss store.Store) {
|
||||
assert.Len(t, d1.DefaultChannelGuestRole, 26)
|
||||
|
||||
// Check the default roles were created correctly.
|
||||
role1, err := ss.Role().GetByName(d1.DefaultTeamAdminRole)
|
||||
role1, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role1.Permissions, []string{"delete_others_posts"})
|
||||
assert.True(t, role1.SchemeManaged)
|
||||
|
||||
role2, err := ss.Role().GetByName(d1.DefaultTeamUserRole)
|
||||
role2, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role2.Permissions, []string{"view_team", "add_user_to_team"})
|
||||
assert.True(t, role2.SchemeManaged)
|
||||
|
||||
role3, err := ss.Role().GetByName(d1.DefaultChannelAdminRole)
|
||||
role3, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role3.Permissions, []string{"manage_public_channel_members", "manage_private_channel_members"})
|
||||
assert.True(t, role3.SchemeManaged)
|
||||
|
||||
role4, err := ss.Role().GetByName(d1.DefaultChannelUserRole)
|
||||
role4, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role4.Permissions, []string{"read_channel", "create_post"})
|
||||
assert.True(t, role4.SchemeManaged)
|
||||
|
||||
role5, err := ss.Role().GetByName(d1.DefaultTeamGuestRole)
|
||||
role5, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role5.Permissions, []string{"view_team"})
|
||||
assert.True(t, role5.SchemeManaged)
|
||||
|
||||
role6, err := ss.Role().GetByName(d1.DefaultChannelGuestRole)
|
||||
role6, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role6.Permissions, []string{"read_channel", "create_post"})
|
||||
assert.True(t, role6.SchemeManaged)
|
||||
@@ -336,32 +337,32 @@ func testSchemeStoreDelete(t *testing.T, ss store.Store) {
|
||||
assert.Len(t, d1.DefaultChannelGuestRole, 26)
|
||||
|
||||
// Check the default roles were created correctly.
|
||||
role1, err := ss.Role().GetByName(d1.DefaultTeamAdminRole)
|
||||
role1, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role1.Permissions, []string{"delete_others_posts"})
|
||||
assert.True(t, role1.SchemeManaged)
|
||||
|
||||
role2, err := ss.Role().GetByName(d1.DefaultTeamUserRole)
|
||||
role2, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role2.Permissions, []string{"view_team", "add_user_to_team"})
|
||||
assert.True(t, role2.SchemeManaged)
|
||||
|
||||
role3, err := ss.Role().GetByName(d1.DefaultChannelAdminRole)
|
||||
role3, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role3.Permissions, []string{"manage_public_channel_members", "manage_private_channel_members"})
|
||||
assert.True(t, role3.SchemeManaged)
|
||||
|
||||
role4, err := ss.Role().GetByName(d1.DefaultChannelUserRole)
|
||||
role4, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role4.Permissions, []string{"read_channel", "create_post"})
|
||||
assert.True(t, role4.SchemeManaged)
|
||||
|
||||
role5, err := ss.Role().GetByName(d1.DefaultTeamGuestRole)
|
||||
role5, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role5.Permissions, []string{"view_team"})
|
||||
assert.True(t, role5.SchemeManaged)
|
||||
|
||||
role6, err := ss.Role().GetByName(d1.DefaultChannelGuestRole)
|
||||
role6, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, role6.Permissions, []string{"read_channel", "create_post"})
|
||||
assert.True(t, role6.SchemeManaged)
|
||||
@@ -372,27 +373,27 @@ func testSchemeStoreDelete(t *testing.T, ss store.Store) {
|
||||
assert.NotZero(t, d2.DeleteAt)
|
||||
|
||||
// Check that the roles are deleted too.
|
||||
role7, err := ss.Role().GetByName(d1.DefaultTeamAdminRole)
|
||||
role7, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamAdminRole)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, role7.DeleteAt)
|
||||
|
||||
role8, err := ss.Role().GetByName(d1.DefaultTeamUserRole)
|
||||
role8, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamUserRole)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, role8.DeleteAt)
|
||||
|
||||
role9, err := ss.Role().GetByName(d1.DefaultChannelAdminRole)
|
||||
role9, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelAdminRole)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, role9.DeleteAt)
|
||||
|
||||
role10, err := ss.Role().GetByName(d1.DefaultChannelUserRole)
|
||||
role10, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelUserRole)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, role10.DeleteAt)
|
||||
|
||||
role11, err := ss.Role().GetByName(d1.DefaultTeamGuestRole)
|
||||
role11, err := ss.Role().GetByName(context.Background(), d1.DefaultTeamGuestRole)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, role11.DeleteAt)
|
||||
|
||||
role12, err := ss.Role().GetByName(d1.DefaultChannelGuestRole)
|
||||
role12, err := ss.Role().GetByName(context.Background(), d1.DefaultChannelGuestRole)
|
||||
assert.NoError(t, err)
|
||||
assert.NotZero(t, role12.DeleteAt)
|
||||
|
||||
@@ -538,10 +539,10 @@ func testCountWithoutPermission(t *testing.T, ss store.Store) {
|
||||
|
||||
getRoles := func(scheme *model.Scheme) (channelUser, channelGuest *model.Role) {
|
||||
var err error
|
||||
channelUser, err = ss.Role().GetByName(scheme.DefaultChannelUserRole)
|
||||
channelUser, err = ss.Role().GetByName(context.Background(), scheme.DefaultChannelUserRole)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, channelUser)
|
||||
channelGuest, err = ss.Role().GetByName(scheme.DefaultChannelGuestRole)
|
||||
channelGuest, err = ss.Role().GetByName(context.Background(), scheme.DefaultChannelGuestRole)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, channelGuest)
|
||||
return
|
||||
|
||||
@@ -5929,10 +5929,10 @@ func (s *TimerLayerRoleStore) GetAll() ([]*model.Role, error) {
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerRoleStore) GetByName(name string) (*model.Role, error) {
|
||||
func (s *TimerLayerRoleStore) GetByName(ctx context.Context, name string) (*model.Role, error) {
|
||||
start := timemodule.Now()
|
||||
|
||||
result, err := s.RoleStore.GetByName(name)
|
||||
result, err := s.RoleStore.GetByName(ctx, name)
|
||||
|
||||
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
|
||||
Ссылка в новой задаче
Block a user