From 588a731d6df839b9b52b1ef6c5cbba63ff6e2269 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Sat, 26 Feb 2022 14:00:39 +0100 Subject: [PATCH] delay creation of default roles Signed-off-by: jkoberg --- settings/pkg/service/v0/service.go | 26 +++++++++++-------------- settings/pkg/settings/settings.go | 2 +- settings/pkg/store/filesystem/store.go | 3 ++- settings/pkg/store/metadata/store.go | 27 +++++++++++++++----------- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/settings/pkg/service/v0/service.go b/settings/pkg/service/v0/service.go index 87dc662e2..747b1ce93 100644 --- a/settings/pkg/service/v0/service.go +++ b/settings/pkg/service/v0/service.go @@ -32,12 +32,11 @@ type Service struct { // NewService returns a service implementation for Service. func NewService(cfg *config.Config, logger log.Logger) Service { service := Service{ - id: "ocis-settings", - config: cfg, - logger: logger, - manager: store.New(cfg), + id: "ocis-settings", + config: cfg, + logger: logger, } - service.RegisterDefaultRoles() + service.manager = store.New(cfg, service.RegisterDefaultRoles) return service } @@ -87,23 +86,20 @@ func (g Service) CheckPermission(ctx context.Context, req *permissions.CheckPerm } // RegisterDefaultRoles composes default roles and saves them. Skipped if the roles already exist. -func (g Service) RegisterDefaultRoles() { - // TODO: we can't register on service start any more because metadata might not be up yet - // we need to lazy initialize - if true { - return - } +// 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) { // 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, _ := g.manager.ReadBundle(role.Id) + bundle, _ := m.ReadBundle(role.Id) if bundle != nil { g.logger.Debug().Str("bundleID", bundleID).Msg("bundle already exists. skipping.") continue } // create the role - _, err := g.manager.WriteBundle(role) + _, err := m.WriteBundle(role) if err != nil { g.logger.Error().Err(err).Str("bundleID", bundleID).Msg("failed to register bundle") } @@ -111,7 +107,7 @@ func (g Service) RegisterDefaultRoles() { } for _, req := range generatePermissionRequests() { - _, err := g.manager.AddSettingToBundle(req.GetBundleId(), req.GetSetting()) + _, err := m.AddSettingToBundle(req.GetBundleId(), req.GetSetting()) if err != nil { g.logger.Error(). Err(err). @@ -122,7 +118,7 @@ func (g Service) RegisterDefaultRoles() { } for _, req := range defaultRoleAssignments() { - if _, err := g.manager.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil { + if _, err := m.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil { g.logger.Error().Err(err).Msg("failed to register role assignment") } } diff --git a/settings/pkg/settings/settings.go b/settings/pkg/settings/settings.go index 9132423e8..0f3cf9fe5 100644 --- a/settings/pkg/settings/settings.go +++ b/settings/pkg/settings/settings.go @@ -16,7 +16,7 @@ var ( ) // RegisterFunc stores store constructors -type RegisterFunc func(*config.Config) Manager +type RegisterFunc func(*config.Config, func(Manager)) Manager // Manager combines service interfaces for abstraction of storage implementations type Manager interface { diff --git a/settings/pkg/store/filesystem/store.go b/settings/pkg/store/filesystem/store.go index ccd0fe011..fee4c7ebd 100644 --- a/settings/pkg/store/filesystem/store.go +++ b/settings/pkg/store/filesystem/store.go @@ -22,7 +22,7 @@ type Store struct { } // New creates a new store -func New(cfg *config.Config) settings.Manager { +func New(cfg *config.Config, initStore func(settings.Manager)) settings.Manager { s := Store{ //Logger: olog.NewLogger( // olog.Color(cfg.Log.Color), @@ -42,6 +42,7 @@ func New(cfg *config.Config) settings.Manager { } s.dataPath = cfg.DataPath + initStore(&s) return &s } diff --git a/settings/pkg/store/metadata/store.go b/settings/pkg/store/metadata/store.go index 791ffbe29..aac096ec4 100644 --- a/settings/pkg/store/metadata/store.go +++ b/settings/pkg/store/metadata/store.go @@ -37,8 +37,9 @@ type MetadataClient interface { type Store struct { Logger olog.Logger - mdc MetadataClient - cfg *config.Config + mdc MetadataClient + cfg *config.Config + initStore func(settings.Manager) init *sync.Once l *sync.Mutex @@ -69,16 +70,17 @@ func (s Store) Init() { } // New creates a new store -func New(cfg *config.Config) settings.Manager { +func New(cfg *config.Config, initstore func(settings.Manager)) 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), - //), - 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), + ), + initStore: initstore, + l: &sync.Mutex{}, + init: &sync.Once{}, } return &s @@ -98,6 +100,7 @@ func NewMetadataClient(cfg *config.Config) MetadataClient { func (s Store) initMetadataClient() error { s.mdc = NewMetadataClient(s.cfg) + // TODO: this fails because of authentication issues err := s.mdc.Init(nil, settingsSpaceID) if err != nil { return err @@ -114,6 +117,8 @@ func (s Store) initMetadataClient() error { return err } } + + s.initStore(s) return nil }