Signed-off-by: jkoberg <jkoberg@owncloud.com>
This commit is contained in:
jkoberg
2022-03-05 13:46:10 +01:00
parent 429ed2ee76
commit d8242232e4
5 changed files with 34 additions and 32 deletions

View File

@@ -15,7 +15,8 @@ import (
settingssvc "github.com/owncloud/ocis/protogen/gen/ocis/services/settings/v0"
"github.com/owncloud/ocis/settings/pkg/config"
"github.com/owncloud/ocis/settings/pkg/settings"
store "github.com/owncloud/ocis/settings/pkg/store/metadata"
filestore "github.com/owncloud/ocis/settings/pkg/store/filesystem"
metastore "github.com/owncloud/ocis/settings/pkg/store/metadata"
merrors "go-micro.dev/v4/errors"
"go-micro.dev/v4/metadata"
"google.golang.org/protobuf/types/known/emptypb"
@@ -36,7 +37,17 @@ func NewService(cfg *config.Config, logger log.Logger) Service {
config: cfg,
logger: logger,
}
service.manager = store.New(cfg, service.RegisterDefaultRoles)
switch cfg.StoreType {
default:
fallthrough
case "metadata":
service.manager = metastore.New(cfg)
case "filesystem":
service.manager = filestore.New(cfg)
// TODO: if we want to further support filesystem store it should use default permissions from store/defaults.go instead using this duplicate
service.RegisterDefaultRoles()
}
return service
}
@@ -86,20 +97,18 @@ func (g Service) CheckPermission(ctx context.Context, req *permissions.CheckPerm
}
// RegisterDefaultRoles composes default roles and saves them. Skipped if the roles already exist.
// NOTE: we can't register on service start any more because metadata might not be up yet
// we need to lazy initialize
func (g Service) RegisterDefaultRoles(m settings.Manager) {
func (g Service) RegisterDefaultRoles() {
// FIXME: we're writing default roles per service start (i.e. twice at the moment, for http and grpc server). has to happen only once.
for _, role := range generateBundlesDefaultRoles() {
bundleID := role.Extension + "." + role.Id
// check if the role already exists
bundle, _ := m.ReadBundle(role.Id)
bundle, _ := g.manager.ReadBundle(role.Id)
if bundle != nil {
g.logger.Debug().Str("bundleID", bundleID).Msg("bundle already exists. skipping.")
continue
}
// create the role
_, err := m.WriteBundle(role)
_, err := g.manager.WriteBundle(role)
if err != nil {
g.logger.Error().Err(err).Str("bundleID", bundleID).Msg("failed to register bundle")
}
@@ -107,7 +116,7 @@ func (g Service) RegisterDefaultRoles(m settings.Manager) {
}
for _, req := range generatePermissionRequests() {
_, err := m.AddSettingToBundle(req.GetBundleId(), req.GetSetting())
_, err := g.manager.AddSettingToBundle(req.GetBundleId(), req.GetSetting())
if err != nil {
g.logger.Error().
Err(err).
@@ -118,7 +127,7 @@ func (g Service) RegisterDefaultRoles(m settings.Manager) {
}
for _, req := range defaultRoleAssignments() {
if _, err := m.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil {
if _, err := g.manager.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil {
g.logger.Error().Err(err).Msg("failed to register role assignment")
}
}

View File

@@ -16,7 +16,7 @@ var (
)
// RegisterFunc stores store constructors
type RegisterFunc func(*config.Config, func(Manager)) Manager
type RegisterFunc func(*config.Config) Manager
// Manager combines service interfaces for abstraction of storage implementations
type Manager interface {

View File

@@ -22,7 +22,7 @@ type Store struct {
}
// New creates a new store
func New(cfg *config.Config, initStore func(settings.Manager)) settings.Manager {
func New(cfg *config.Config) settings.Manager {
s := Store{
//Logger: olog.NewLogger(
// olog.Color(cfg.Log.Color),
@@ -42,7 +42,6 @@ func New(cfg *config.Config, initStore func(settings.Manager)) settings.Manager
}
s.dataPath = cfg.DataPath
initStore(&s)
return &s
}

View File

@@ -36,7 +36,7 @@ func (c *CachedMDC) SimpleDownload(ctx context.Context, id string) ([]byte, erro
return nil, err
}
c.files.Set(id, b)
_ = c.files.Set(id, b)
return b, nil
}
@@ -54,15 +54,14 @@ func (c *CachedMDC) SimpleUpload(ctx context.Context, id string, content []byte)
}
// invalidate caches
err = c.dirs.Remove(path.Dir(id))
err = c.files.Set(id, content)
_ = c.dirs.Remove(path.Dir(id))
_ = c.files.Set(id, content)
return nil
}
// Delete invalidates the cache when operation was successful
func (c *CachedMDC) Delete(ctx context.Context, id string) error {
err := c.next.Delete(ctx, id)
if err != nil {
if err := c.next.Delete(ctx, id); err != nil {
return err
}

View File

@@ -43,10 +43,8 @@ type Store struct {
mdc MetadataClient
cfg *config.Config
//initStore func(settings.Manager)
init *sync.Once
l *sync.Mutex
l *sync.Mutex
}
// Init initialize the store once, later calls are noops
@@ -62,26 +60,23 @@ func (s *Store) Init() {
return
}
//s.init.Do(func() {
mdc := &CachedMDC{next: NewMetadataClient(s.cfg.Metadata)}
if err := s.initMetadataClient(mdc); err != nil {
s.Logger.Error().Err(err).Msg("error initializing metadata client")
}
//})
}
// New creates a new store
func New(cfg *config.Config, initstore func(settings.Manager)) settings.Manager {
func New(cfg *config.Config) settings.Manager {
s := Store{
//Logger: olog.NewLogger(
//olog.Color(cfg.Log.Color),
//olog.Pretty(cfg.Log.Pretty),
//olog.Level(cfg.Log.Level),
//olog.File(cfg.Log.File),
//),
cfg: cfg,
l: &sync.Mutex{},
init: &sync.Once{},
Logger: olog.NewLogger(
olog.Color(cfg.Log.Color),
olog.Pretty(cfg.Log.Pretty),
olog.Level(cfg.Log.Level),
olog.File(cfg.Log.File),
),
cfg: cfg,
l: &sync.Mutex{},
}
return &s