From b78da99b4da593f77b404e74db2b4b910ef7ab06 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 10:05:09 +0300 Subject: [PATCH 01/10] [#294] aclsvc: Refactor checker constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 11 +++--- pkg/services/object/acl/acl.go | 55 ++++++----------------------- pkg/services/object/acl/acl_test.go | 11 +++--- 3 files changed, 20 insertions(+), 57 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 1d99d958b..45b1089a7 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -429,12 +429,11 @@ func createACLServiceV2(c *cfg, splitSvc *objectService.TransportSplitter) v2.Se ), v2.WithNextService(splitSvc), v2.WithEACLChecker( - acl.NewChecker(new(acl.CheckerPrm). - SetNetmapState(c.cfgNetmap.state). - SetEACLSource(c.cfgObject.eaclSource). - SetValidator(eaclSDK.NewValidator()). - SetLocalStorage(ls), - ), + acl.NewChecker( + c.cfgNetmap.state, + c.cfgObject.eaclSource, + eaclSDK.NewValidator(), + ls), ), ) } diff --git a/pkg/services/object/acl/acl.go b/pkg/services/object/acl/acl.go index 351b4ad3b..cfe49396e 100644 --- a/pkg/services/object/acl/acl.go +++ b/pkg/services/object/acl/acl.go @@ -21,35 +21,6 @@ import ( "github.com/nspcc-dev/neo-go/pkg/crypto/keys" ) -// CheckerPrm groups parameters for Checker -// constructor. -type CheckerPrm struct { - eaclSrc container.EACLSource - validator *eaclSDK.Validator - localStorage *engine.StorageEngine - state netmap.State -} - -func (c *CheckerPrm) SetEACLSource(v container.EACLSource) *CheckerPrm { - c.eaclSrc = v - return c -} - -func (c *CheckerPrm) SetValidator(v *eaclSDK.Validator) *CheckerPrm { - c.validator = v - return c -} - -func (c *CheckerPrm) SetLocalStorage(v *engine.StorageEngine) *CheckerPrm { - c.localStorage = v - return c -} - -func (c *CheckerPrm) SetNetmapState(v netmap.State) *CheckerPrm { - c.state = v - return c -} - // Checker implements v2.ACLChecker interfaces and provides // ACL/eACL validation functionality. type Checker struct { @@ -71,23 +42,17 @@ var ( // NewChecker creates Checker. // Panics if at least one of the parameter is nil. -func NewChecker(prm *CheckerPrm) *Checker { - panicOnNil := func(fieldName string, field any) { - if field == nil { - panic(fmt.Sprintf("incorrect field %s (%T): %v", fieldName, field, field)) - } - } - - panicOnNil("EACLSource", prm.eaclSrc) - panicOnNil("EACLValidator", prm.validator) - panicOnNil("LocalStorageEngine", prm.localStorage) - panicOnNil("NetmapState", prm.state) - +func NewChecker( + state netmap.State, + eaclSrc container.EACLSource, + validator *eaclSDK.Validator, + localStorage *engine.StorageEngine, +) *Checker { return &Checker{ - eaclSrc: prm.eaclSrc, - validator: prm.validator, - localStorage: prm.localStorage, - state: prm.state, + eaclSrc: eaclSrc, + validator: validator, + localStorage: localStorage, + state: state, } } diff --git a/pkg/services/object/acl/acl_test.go b/pkg/services/object/acl/acl_test.go index d3ad1e6fd..b9b82dac8 100644 --- a/pkg/services/object/acl/acl_test.go +++ b/pkg/services/object/acl/acl_test.go @@ -27,12 +27,11 @@ func (e emptyNetmapState) CurrentEpoch() uint64 { } func TestStickyCheck(t *testing.T) { - checker := NewChecker(new(CheckerPrm). - SetLocalStorage(&engine.StorageEngine{}). - SetValidator(eaclSDK.NewValidator()). - SetEACLSource(emptyEACLSource{}). - SetNetmapState(emptyNetmapState{}), - ) + checker := NewChecker( + emptyNetmapState{}, + emptyEACLSource{}, + eaclSDK.NewValidator(), + &engine.StorageEngine{}) t.Run("system role", func(t *testing.T) { var info v2.RequestInfo -- 2.45.3 From 16abc1f298a5452a04ec42f2238a83be2bf1bc4e Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 11:28:36 +0300 Subject: [PATCH 02/10] [#294] aclsvc: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- pkg/services/object/acl/acl.go | 36 +++++++++-------- pkg/services/object/acl/eacl/v2/eacl_test.go | 6 +-- pkg/services/object/acl/eacl/v2/headers.go | 20 ++++------ pkg/services/object/acl/eacl/v2/localstore.go | 22 ----------- pkg/services/object/acl/eacl/v2/opts.go | 39 ------------------- pkg/services/object/acl/eacl/v2/xheader.go | 10 ++++- 6 files changed, 39 insertions(+), 94 deletions(-) delete mode 100644 pkg/services/object/acl/eacl/v2/localstore.go diff --git a/pkg/services/object/acl/acl.go b/pkg/services/object/acl/acl.go index cfe49396e..921545c8b 100644 --- a/pkg/services/object/acl/acl.go +++ b/pkg/services/object/acl/acl.go @@ -1,10 +1,12 @@ package acl import ( + "context" "crypto/ecdsa" "crypto/elliptic" "errors" "fmt" + "io" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/netmap" @@ -17,6 +19,8 @@ import ( cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa" eaclSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl" + objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" + oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" ) @@ -30,6 +34,18 @@ type Checker struct { state netmap.State } +type localStorage struct { + ls *engine.StorageEngine +} + +func (s *localStorage) Head(ctx context.Context, addr oid.Address) (*objectSDK.Object, error) { + if s.ls == nil { + return nil, io.ErrUnexpectedEOF + } + + return engine.Head(ctx, s.ls, addr) +} + // Various EACL check errors. var ( errEACLDeniedByRule = errors.New("denied by rule") @@ -158,26 +174,14 @@ func getRole(reqInfo v2.RequestInfo) eaclSDK.Role { } func (c *Checker) getHeaderSource(cnr cid.ID, msg any, reqInfo v2.RequestInfo) (eaclSDK.TypedHeaderSource, error) { - hdrSrcOpts := make([]eaclV2.Option, 0, 3) - - hdrSrcOpts = append(hdrSrcOpts, - eaclV2.WithLocalObjectStorage(c.localStorage), - eaclV2.WithCID(cnr), - eaclV2.WithOID(reqInfo.ObjectID()), - ) - + var xHeaderSource eaclV2.XHeaderSource if req, ok := msg.(eaclV2.Request); ok { - hdrSrcOpts = append(hdrSrcOpts, eaclV2.WithServiceRequest(req)) + xHeaderSource = eaclV2.NewRequestXHeaderSource(req) } else { - hdrSrcOpts = append(hdrSrcOpts, - eaclV2.WithServiceResponse( - msg.(eaclV2.Response), - reqInfo.Request().(eaclV2.Request), - ), - ) + xHeaderSource = eaclV2.NewResponseXHeaderSource(msg.(eaclV2.Response), reqInfo.Request().(eaclV2.Request)) } - hdrSrc, err := eaclV2.NewMessageHeaderSource(hdrSrcOpts...) + hdrSrc, err := eaclV2.NewMessageHeaderSource(&localStorage{ls: c.localStorage}, xHeaderSource, cnr, eaclV2.WithOID(reqInfo.ObjectID())) if err != nil { return nil, fmt.Errorf("can't parse headers: %w", err) } diff --git a/pkg/services/object/acl/eacl/v2/eacl_test.go b/pkg/services/object/acl/eacl/v2/eacl_test.go index 6f879123b..023b99239 100644 --- a/pkg/services/object/acl/eacl/v2/eacl_test.go +++ b/pkg/services/object/acl/eacl/v2/eacl_test.go @@ -103,9 +103,9 @@ func TestHeadRequest(t *testing.T) { newSource := func(t *testing.T) eaclSDK.TypedHeaderSource { hdrSrc, err := NewMessageHeaderSource( - WithObjectStorage(lStorage), - WithServiceRequest(req), - WithCID(addr.Container()), + lStorage, + NewRequestXHeaderSource(req), + addr.Container(), WithOID(&id)) require.NoError(t, err) return hdrSrc diff --git a/pkg/services/object/acl/eacl/v2/headers.go b/pkg/services/object/acl/eacl/v2/headers.go index c7a1b7729..7408c96e9 100644 --- a/pkg/services/object/acl/eacl/v2/headers.go +++ b/pkg/services/object/acl/eacl/v2/headers.go @@ -21,7 +21,7 @@ type Option func(*cfg) type cfg struct { storage ObjectStorage - msg xHeaderSource + msg XHeaderSource cnr cid.ID obj *oid.ID @@ -46,14 +46,12 @@ type headerSource struct { incompleteObjectHeaders bool } -func defaultCfg() *cfg { - return &cfg{ - storage: new(localStorage), +func NewMessageHeaderSource(os ObjectStorage, xhs XHeaderSource, cnrID cid.ID, opts ...Option) (eaclSDK.TypedHeaderSource, error) { + cfg := &cfg{ + storage: os, + cnr: cnrID, + msg: xhs, } -} - -func NewMessageHeaderSource(opts ...Option) (eaclSDK.TypedHeaderSource, error) { - cfg := defaultCfg() for i := range opts { opts[i](cfg) @@ -70,7 +68,7 @@ func NewMessageHeaderSource(opts ...Option) (eaclSDK.TypedHeaderSource, error) { return nil, err } - res.requestHeaders = requestHeaders(cfg.msg) + res.requestHeaders = cfg.msg.GetXHeaders() return res, nil } @@ -96,10 +94,6 @@ func (x xHeader) Value() string { return (*session.XHeader)(&x).GetValue() } -func requestHeaders(msg xHeaderSource) []eaclSDK.Header { - return msg.GetXHeaders() -} - var errMissingOID = errors.New("object ID is missing") func (h *cfg) readObjectHeaders(dst *headerSource) error { diff --git a/pkg/services/object/acl/eacl/v2/localstore.go b/pkg/services/object/acl/eacl/v2/localstore.go deleted file mode 100644 index 0f23e9881..000000000 --- a/pkg/services/object/acl/eacl/v2/localstore.go +++ /dev/null @@ -1,22 +0,0 @@ -package v2 - -import ( - "context" - "io" - - "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/engine" - objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" -) - -type localStorage struct { - ls *engine.StorageEngine -} - -func (s *localStorage) Head(ctx context.Context, addr oid.Address) (*objectSDK.Object, error) { - if s.ls == nil { - return nil, io.ErrUnexpectedEOF - } - - return engine.Head(ctx, s.ls, addr) -} diff --git a/pkg/services/object/acl/eacl/v2/opts.go b/pkg/services/object/acl/eacl/v2/opts.go index 7657e8780..d91a21c75 100644 --- a/pkg/services/object/acl/eacl/v2/opts.go +++ b/pkg/services/object/acl/eacl/v2/opts.go @@ -1,48 +1,9 @@ package v2 import ( - "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/engine" - cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" ) -func WithObjectStorage(v ObjectStorage) Option { - return func(c *cfg) { - c.storage = v - } -} - -func WithLocalObjectStorage(v *engine.StorageEngine) Option { - return func(c *cfg) { - c.storage = &localStorage{ - ls: v, - } - } -} - -func WithServiceRequest(v Request) Option { - return func(c *cfg) { - c.msg = requestXHeaderSource{ - req: v, - } - } -} - -func WithServiceResponse(resp Response, req Request) Option { - return func(c *cfg) { - c.msg = responseXHeaderSource{ - resp: resp, - req: req, - } - } -} - -func WithCID(v cid.ID) Option { - return func(c *cfg) { - c.cnr = v - } -} - func WithOID(v *oid.ID) Option { return func(c *cfg) { c.obj = v diff --git a/pkg/services/object/acl/eacl/v2/xheader.go b/pkg/services/object/acl/eacl/v2/xheader.go index 246714af7..c1fdea9d8 100644 --- a/pkg/services/object/acl/eacl/v2/xheader.go +++ b/pkg/services/object/acl/eacl/v2/xheader.go @@ -5,7 +5,7 @@ import ( eaclSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl" ) -type xHeaderSource interface { +type XHeaderSource interface { GetXHeaders() []eaclSDK.Header } @@ -13,12 +13,20 @@ type requestXHeaderSource struct { req Request } +func NewRequestXHeaderSource(req Request) XHeaderSource { + return requestXHeaderSource{req: req} +} + type responseXHeaderSource struct { resp Response req Request } +func NewResponseXHeaderSource(resp Response, req Request) XHeaderSource { + return responseXHeaderSource{resp: resp, req: req} +} + func (s requestXHeaderSource) GetXHeaders() []eaclSDK.Header { ln := 0 -- 2.45.3 From 382cb8084b91bf174f9b733541e738bc5e4cc729 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 11:44:37 +0300 Subject: [PATCH 03/10] [#294] aclsvcv2: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 22 +++++++-------- pkg/services/object/acl/v2/opts.go | 39 --------------------------- pkg/services/object/acl/v2/service.go | 34 ++++++++++------------- 3 files changed, 23 insertions(+), 72 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 45b1089a7..da7458170 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -421,20 +421,16 @@ func createACLServiceV2(c *cfg, splitSvc *objectService.TransportSplitter) v2.Se irFetcher := createInnerRingFetcher(c) return v2.New( + splitSvc, + c.netMapSource, + newCachedIRFetcher(irFetcher), + acl.NewChecker( + c.cfgNetmap.state, + c.cfgObject.eaclSource, + eaclSDK.NewValidator(), + ls), + c.cfgObject.cnrSource, v2.WithLogger(c.log), - v2.WithIRFetcher(newCachedIRFetcher(irFetcher)), - v2.WithNetmapSource(c.netMapSource), - v2.WithContainerSource( - c.cfgObject.cnrSource, - ), - v2.WithNextService(splitSvc), - v2.WithEACLChecker( - acl.NewChecker( - c.cfgNetmap.state, - c.cfgObject.eaclSource, - eaclSDK.NewValidator(), - ls), - ), ) } diff --git a/pkg/services/object/acl/v2/opts.go b/pkg/services/object/acl/v2/opts.go index 7e937da06..15fcce884 100644 --- a/pkg/services/object/acl/v2/opts.go +++ b/pkg/services/object/acl/v2/opts.go @@ -1,9 +1,6 @@ package v2 import ( - "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container" - "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/netmap" - objectSvc "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger" ) @@ -13,39 +10,3 @@ func WithLogger(v *logger.Logger) Option { c.log = v } } - -// WithNetmapSource return option to set -// netmap source. -func WithNetmapSource(v netmap.Source) Option { - return func(c *cfg) { - c.nm = v - } -} - -// WithContainerSource returns option to set container source. -func WithContainerSource(v container.Source) Option { - return func(c *cfg) { - c.containers = v - } -} - -// WithNextService returns option to set next object service. -func WithNextService(v objectSvc.ServiceServer) Option { - return func(c *cfg) { - c.next = v - } -} - -// WithEACLChecker returns option to set eACL checker. -func WithEACLChecker(v ACLChecker) Option { - return func(c *cfg) { - c.checker = v - } -} - -// WithIRFetcher returns option to set inner ring fetcher. -func WithIRFetcher(v InnerRingFetcher) Option { - return func(c *cfg) { - c.irFetcher = v - } -} diff --git a/pkg/services/object/acl/v2/service.go b/pkg/services/object/acl/v2/service.go index c75bd326f..412708b1c 100644 --- a/pkg/services/object/acl/v2/service.go +++ b/pkg/services/object/acl/v2/service.go @@ -73,32 +73,26 @@ type cfg struct { next object.ServiceServer } -func defaultCfg() *cfg { - return &cfg{ - log: &logger.Logger{Logger: zap.L()}, - } -} - // New is a constructor for object ACL checking service. -func New(opts ...Option) Service { - cfg := defaultCfg() +func New(next object.ServiceServer, + nm netmap.Source, + irf InnerRingFetcher, + acl ACLChecker, + cs container.Source, + opts ...Option) Service { + cfg := &cfg{ + log: &logger.Logger{Logger: zap.L()}, + next: next, + nm: nm, + irFetcher: irf, + checker: acl, + containers: cs, + } for i := range opts { opts[i](cfg) } - panicOnNil := func(v any, name string) { - if v == nil { - panic(fmt.Sprintf("ACL service: %s is nil", name)) - } - } - - panicOnNil(cfg.next, "next Service") - panicOnNil(cfg.nm, "netmap client") - panicOnNil(cfg.irFetcher, "inner Ring fetcher") - panicOnNil(cfg.checker, "acl checker") - panicOnNil(cfg.containers, "container source") - return Service{ cfg: cfg, c: senderClassifier{ -- 2.45.3 From b114074a6f65f148bcb38d620a06322d0dac6645 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 11:53:18 +0300 Subject: [PATCH 04/10] [#294] deletesvcv2: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 4 +--- pkg/services/object/delete/v2/service.go | 23 ++--------------------- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index da7458170..3f0db1461 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -397,9 +397,7 @@ func createDeleteService(c *cfg, keyStorage *util.KeyStorage, sGet *getsvc.Servi } func createDeleteServiceV2(sDelete *deletesvc.Service) *deletesvcV2.Service { - return deletesvcV2.NewService( - deletesvcV2.WithInternalService(sDelete), - ) + return deletesvcV2.NewService(sDelete) } func createSplitService(c *cfg, sPutV2 *putsvcV2.Service, sGetV2 *getsvcV2.Service, diff --git a/pkg/services/object/delete/v2/service.go b/pkg/services/object/delete/v2/service.go index 51759c5df..10dcd0e87 100644 --- a/pkg/services/object/delete/v2/service.go +++ b/pkg/services/object/delete/v2/service.go @@ -9,26 +9,13 @@ import ( // Service implements Delete operation of Object service v2. type Service struct { - *cfg -} - -// Option represents Service constructor option. -type Option func(*cfg) - -type cfg struct { svc *deletesvc.Service } // NewService constructs Service instance from provided options. -func NewService(opts ...Option) *Service { - c := new(cfg) - - for i := range opts { - opts[i](c) - } - +func NewService(svc *deletesvc.Service) *Service { return &Service{ - cfg: c, + svc: svc, } } @@ -51,9 +38,3 @@ func (s *Service) Delete(ctx context.Context, req *objectV2.DeleteRequest) (*obj return resp, nil } - -func WithInternalService(v *deletesvc.Service) Option { - return func(c *cfg) { - c.svc = v - } -} -- 2.45.3 From af90d39a5ba5821aaa71e7558f34211208910ecb Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 12:04:00 +0300 Subject: [PATCH 05/10] [#294] deletesvc: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 14 +++---- pkg/services/object/delete/service.go | 58 +++++++-------------------- 2 files changed, 21 insertions(+), 51 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 3f0db1461..1f763dd9a 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -382,17 +382,17 @@ func createGetServiceV2(sGet *getsvc.Service, keyStorage *util.KeyStorage) *gets func createDeleteService(c *cfg, keyStorage *util.KeyStorage, sGet *getsvc.Service, sSearch *searchsvc.Service, sPut *putsvc.Service) *deletesvc.Service { return deletesvc.New( - deletesvc.WithLogger(c.log), - deletesvc.WithHeadService(sGet), - deletesvc.WithSearchService(sSearch), - deletesvc.WithPutService(sPut), - deletesvc.WithNetworkInfo(&delNetInfo{ + sGet, + sSearch, + sPut, + &delNetInfo{ State: c.cfgNetmap.state, tsLifetime: c.cfgObject.tombstoneLifetime, cfg: c, - }), - deletesvc.WithKeyStorage(keyStorage), + }, + keyStorage, + deletesvc.WithLogger(c.log), ) } diff --git a/pkg/services/object/delete/service.go b/pkg/services/object/delete/service.go index 5c09ad123..e208a298b 100644 --- a/pkg/services/object/delete/service.go +++ b/pkg/services/object/delete/service.go @@ -62,16 +62,22 @@ type cfg struct { keyStorage *util.KeyStorage } -func defaultCfg() *cfg { - return &cfg{ - log: &logger.Logger{Logger: zap.L()}, - } -} - // New creates, initializes and returns utility serving // Object.Get service requests. -func New(opts ...Option) *Service { - c := defaultCfg() +func New(gs *getsvc.Service, + ss *searchsvc.Service, + ps *putsvc.Service, + ni NetworkInfo, + ks *util.KeyStorage, + opts ...Option) *Service { + c := &cfg{ + log: &logger.Logger{Logger: zap.L()}, + header: (*headSvcWrapper)(gs), + searcher: (*searchSvcWrapper)(ss), + placer: (*putSvcWrapper)(ps), + netInfo: ni, + keyStorage: ks, + } for i := range opts { opts[i](c) @@ -88,39 +94,3 @@ func WithLogger(l *logger.Logger) Option { c.log = &logger.Logger{Logger: l.With(zap.String("component", "objectSDK.Delete service"))} } } - -// WithHeadService returns option to set Head service -// to work with object headers. -func WithHeadService(h *getsvc.Service) Option { - return func(c *cfg) { - c.header = (*headSvcWrapper)(h) - } -} - -// WithSearchService returns option to set search service. -func WithSearchService(s *searchsvc.Service) Option { - return func(c *cfg) { - c.searcher = (*searchSvcWrapper)(s) - } -} - -// WithPutService returns option to specify put service. -func WithPutService(p *putsvc.Service) Option { - return func(c *cfg) { - c.placer = (*putSvcWrapper)(p) - } -} - -// WithNetworkInfo returns option to set network information source. -func WithNetworkInfo(netInfo NetworkInfo) Option { - return func(c *cfg) { - c.netInfo = netInfo - } -} - -// WithKeyStorage returns option to set local private key storage. -func WithKeyStorage(ks *util.KeyStorage) Option { - return func(c *cfg) { - c.keyStorage = ks - } -} -- 2.45.3 From 9225841cb38b2d6a5a1d625d8c5795905ac6894b Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 12:21:03 +0300 Subject: [PATCH 06/10] [#294] putsvc: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 16 +++--- pkg/services/object/put/service.go | 84 ++++++++---------------------- 2 files changed, 30 insertions(+), 70 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 1f763dd9a..43d68bdcd 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -313,14 +313,14 @@ func createPutSvc(c *cfg, keyStorage *util.KeyStorage) *putsvc.Service { } return putsvc.NewService( - putsvc.WithKeyStorage(keyStorage), - putsvc.WithClientConstructor(c.putClientCache), - putsvc.WithMaxSizeSource(newCachedMaxObjectSizeSource(c)), - putsvc.WithObjectStorage(os), - putsvc.WithContainerSource(c.cfgObject.cnrSource), - putsvc.WithNetworkMapSource(c.netMapSource), - putsvc.WithNetmapKeys(c), - putsvc.WithNetworkState(c.cfgNetmap.state), + keyStorage, + c.putClientCache, + newCachedMaxObjectSizeSource(c), + os, + c.cfgObject.cnrSource, + c.netMapSource, + c, + c.cfgNetmap.state, putsvc.WithWorkerPools(c.cfgObject.pool.putRemote, c.cfgObject.pool.putLocal), putsvc.WithLogger(c.log), ) diff --git a/pkg/services/object/put/service.go b/pkg/services/object/put/service.go index 567a3fea1..7f2600f9c 100644 --- a/pkg/services/object/put/service.go +++ b/pkg/services/object/put/service.go @@ -46,8 +46,6 @@ type cfg struct { fmtValidator *object.FormatValidator - fmtValidatorOpts []object.FormatValidatorOption - networkState netmap.State clientConstructor ClientConstructor @@ -55,22 +53,34 @@ type cfg struct { log *logger.Logger } -func defaultCfg() *cfg { - return &cfg{ - remotePool: util.NewPseudoWorkerPool(), - localPool: util.NewPseudoWorkerPool(), - log: &logger.Logger{Logger: zap.L()}, +func NewService(ks *objutil.KeyStorage, + cc ClientConstructor, + ms MaxSizeSource, + os ObjectStorage, + cs container.Source, + ns netmap.Source, + nk netmap.AnnouncedKeys, + nst netmap.State, + opts ...Option) *Service { + c := &cfg{ + remotePool: util.NewPseudoWorkerPool(), + localPool: util.NewPseudoWorkerPool(), + log: &logger.Logger{Logger: zap.L()}, + keyStorage: ks, + clientConstructor: cc, + maxSizeSrc: ms, + localStore: os, + cnrSrc: cs, + netMapSrc: ns, + netmapKeys: nk, + networkState: nst, } -} - -func NewService(opts ...Option) *Service { - c := defaultCfg() for i := range opts { opts[i](c) } - c.fmtValidator = object.NewFormatValidator(c.fmtValidatorOpts...) + c.fmtValidator = object.NewFormatValidator(object.WithLockSource(os), object.WithNetState(nst)) return &Service{ cfg: c, @@ -83,62 +93,12 @@ func (p *Service) Put() (*Streamer, error) { }, nil } -func WithKeyStorage(v *objutil.KeyStorage) Option { - return func(c *cfg) { - c.keyStorage = v - } -} - -func WithMaxSizeSource(v MaxSizeSource) Option { - return func(c *cfg) { - c.maxSizeSrc = v - } -} - -func WithObjectStorage(v ObjectStorage) Option { - return func(c *cfg) { - c.localStore = v - c.fmtValidatorOpts = append(c.fmtValidatorOpts, object.WithLockSource(v)) - } -} - -func WithContainerSource(v container.Source) Option { - return func(c *cfg) { - c.cnrSrc = v - } -} - -func WithNetworkMapSource(v netmap.Source) Option { - return func(c *cfg) { - c.netMapSrc = v - } -} - func WithWorkerPools(remote, local util.WorkerPool) Option { return func(c *cfg) { c.remotePool, c.localPool = remote, local } } -func WithNetmapKeys(v netmap.AnnouncedKeys) Option { - return func(c *cfg) { - c.netmapKeys = v - } -} - -func WithNetworkState(v netmap.State) Option { - return func(c *cfg) { - c.networkState = v - c.fmtValidatorOpts = append(c.fmtValidatorOpts, object.WithNetState(v)) - } -} - -func WithClientConstructor(v ClientConstructor) Option { - return func(c *cfg) { - c.clientConstructor = v - } -} - func WithLogger(l *logger.Logger) Option { return func(c *cfg) { c.log = l -- 2.45.3 From 185f765b715e402376606e96fb7bf6dc446e00dc Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 12:31:03 +0300 Subject: [PATCH 07/10] [#294] putsvcv2: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 5 +---- pkg/services/object/put/v2/service.go | 30 +++------------------------ 2 files changed, 4 insertions(+), 31 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 43d68bdcd..37dcc7b3e 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -327,10 +327,7 @@ func createPutSvc(c *cfg, keyStorage *util.KeyStorage) *putsvc.Service { } func createPutSvcV2(sPut *putsvc.Service, keyStorage *util.KeyStorage) *putsvcV2.Service { - return putsvcV2.NewService( - putsvcV2.WithInternalService(sPut), - putsvcV2.WithKeyStorage(keyStorage), - ) + return putsvcV2.NewService(sPut, keyStorage) } func createSearchSvc(c *cfg, keyStorage *util.KeyStorage, traverseGen *util.TraverserGenerator, coreConstructor *cache.ClientCache) *searchsvc.Service { diff --git a/pkg/services/object/put/v2/service.go b/pkg/services/object/put/v2/service.go index 78655edc7..db902ae59 100644 --- a/pkg/services/object/put/v2/service.go +++ b/pkg/services/object/put/v2/service.go @@ -12,27 +12,15 @@ import ( // Service implements Put operation of Object service v2. type Service struct { - *cfg -} - -// Option represents Service constructor option. -type Option func(*cfg) - -type cfg struct { svc *putsvc.Service keyStorage *util.KeyStorage } // NewService constructs Service instance from provided options. -func NewService(opts ...Option) *Service { - c := new(cfg) - - for i := range opts { - opts[i](c) - } - +func NewService(svc *putsvc.Service, ks *util.KeyStorage) *Service { return &Service{ - cfg: c, + svc: svc, + keyStorage: ks, } } @@ -52,15 +40,3 @@ func (s *Service) Put() (object.PutObjectStream, error) { func (s *Service) PutSingle(ctx context.Context, req *objectAPI.PutSingleRequest) (*objectAPI.PutSingleResponse, error) { return s.svc.PutSingle(ctx, req) } - -func WithInternalService(v *putsvc.Service) Option { - return func(c *cfg) { - c.svc = v - } -} - -func WithKeyStorage(ks *util.KeyStorage) Option { - return func(c *cfg) { - c.keyStorage = ks - } -} -- 2.45.3 From 7f01da0a32a5f757af8f2a642c9ad5783a5b5c0b Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 12:53:37 +0300 Subject: [PATCH 08/10] [#294] searchsvc: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 16 +++--- pkg/services/object/search/service.go | 72 ++++++++------------------- 2 files changed, 27 insertions(+), 61 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 37dcc7b3e..02336bcbf 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -334,16 +334,14 @@ func createSearchSvc(c *cfg, keyStorage *util.KeyStorage, traverseGen *util.Trav ls := c.cfgObject.cfgLocalStorage.localStorage return searchsvc.New( - searchsvc.WithLogger(c.log), - searchsvc.WithLocalStorageEngine(ls), - searchsvc.WithClientConstructor(coreConstructor), - searchsvc.WithTraverserGenerator( - traverseGen.WithTraverseOptions( - placement.WithoutSuccessTracking(), - ), + ls, + coreConstructor, + traverseGen.WithTraverseOptions( + placement.WithoutSuccessTracking(), ), - searchsvc.WithNetMapSource(c.netMapSource), - searchsvc.WithKeyStorage(keyStorage), + c.netMapSource, + keyStorage, + searchsvc.WithLogger(c.log), ) } diff --git a/pkg/services/object/search/service.go b/pkg/services/object/search/service.go index 708979d79..16b82a620 100644 --- a/pkg/services/object/search/service.go +++ b/pkg/services/object/search/service.go @@ -55,17 +55,28 @@ type cfg struct { keyStore *util.KeyStorage } -func defaultCfg() *cfg { - return &cfg{ - log: &logger.Logger{Logger: zap.L()}, - clientConstructor: new(clientConstructorWrapper), - } -} - // New creates, initializes and returns utility serving // Object.Get service requests. -func New(opts ...Option) *Service { - c := defaultCfg() +func New(e *engine.StorageEngine, + cc ClientConstructor, + tg *util.TraverserGenerator, + ns netmap.Source, + ks *util.KeyStorage, + opts ...Option) *Service { + c := &cfg{ + log: &logger.Logger{Logger: zap.L()}, + clientConstructor: &clientConstructorWrapper{ + constructor: cc, + }, + localStorage: &storageEngineWrapper{ + storage: e, + }, + traverserGenerator: (*traverseGeneratorWrapper)(tg), + currentEpochReceiver: &nmSrcWrapper{ + nmSrc: ns, + }, + keyStore: ks, + } for i := range opts { opts[i](c) @@ -82,46 +93,3 @@ func WithLogger(l *logger.Logger) Option { c.log = &logger.Logger{Logger: l.With(zap.String("component", "Object.Search service"))} } } - -// WithLocalStorageEngine returns option to set local storage -// instance. -func WithLocalStorageEngine(e *engine.StorageEngine) Option { - return func(c *cfg) { - c.localStorage = &storageEngineWrapper{ - storage: e, - } - } -} - -// WithClientConstructor returns option to set constructor of remote node clients. -func WithClientConstructor(v ClientConstructor) Option { - return func(c *cfg) { - c.clientConstructor.(*clientConstructorWrapper).constructor = v - } -} - -// WithTraverserGenerator returns option to set generator of -// placement traverser to get the objects from containers. -func WithTraverserGenerator(t *util.TraverserGenerator) Option { - return func(c *cfg) { - c.traverserGenerator = (*traverseGeneratorWrapper)(t) - } -} - -// WithNetMapSource returns option to set network -// map storage to receive current network state. -func WithNetMapSource(nmSrc netmap.Source) Option { - return func(c *cfg) { - c.currentEpochReceiver = &nmSrcWrapper{ - nmSrc: nmSrc, - } - } -} - -// WithKeyStorage returns option to set private -// key storage for session tokens and node key. -func WithKeyStorage(store *util.KeyStorage) Option { - return func(c *cfg) { - c.keyStore = store - } -} -- 2.45.3 From f1b61c590800b5bc381974aae2817d115a6c38c4 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 6 Jul 2023 12:56:45 +0300 Subject: [PATCH 09/10] [#294] searchsvcv2: Refactor service constructor Pass required deps as args. Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/object.go | 5 +--- pkg/services/object/search/v2/service.go | 36 +++--------------------- 2 files changed, 5 insertions(+), 36 deletions(-) diff --git a/cmd/frostfs-node/object.go b/cmd/frostfs-node/object.go index 02336bcbf..1b9f0c817 100644 --- a/cmd/frostfs-node/object.go +++ b/cmd/frostfs-node/object.go @@ -346,10 +346,7 @@ func createSearchSvc(c *cfg, keyStorage *util.KeyStorage, traverseGen *util.Trav } func createSearchSvcV2(sSearch *searchsvc.Service, keyStorage *util.KeyStorage) *searchsvcV2.Service { - return searchsvcV2.NewService( - searchsvcV2.WithInternalService(sSearch), - searchsvcV2.WithKeyStorage(keyStorage), - ) + return searchsvcV2.NewService(sSearch, keyStorage) } func createGetService(c *cfg, keyStorage *util.KeyStorage, traverseGen *util.TraverserGenerator, diff --git a/pkg/services/object/search/v2/service.go b/pkg/services/object/search/v2/service.go index 17e1bc7e0..78b72ac79 100644 --- a/pkg/services/object/search/v2/service.go +++ b/pkg/services/object/search/v2/service.go @@ -9,28 +9,15 @@ import ( // Service implements Search operation of Object service v2. type Service struct { - *cfg -} - -// Option represents Service constructor option. -type Option func(*cfg) - -type cfg struct { - svc *searchsvc.Service - + svc *searchsvc.Service keyStorage *objutil.KeyStorage } // NewService constructs Service instance from provided options. -func NewService(opts ...Option) *Service { - c := new(cfg) - - for i := range opts { - opts[i](c) - } - +func NewService(s *searchsvc.Service, ks *objutil.KeyStorage) *Service { return &Service{ - cfg: c, + svc: s, + keyStorage: ks, } } @@ -43,18 +30,3 @@ func (s *Service) Search(req *objectV2.SearchRequest, stream objectSvc.SearchStr return s.svc.Search(stream.Context(), *p) } - -// WithInternalService returns option to set entity -// that handles request payload. -func WithInternalService(v *searchsvc.Service) Option { - return func(c *cfg) { - c.svc = v - } -} - -// WithKeyStorage returns option to set local private key storage. -func WithKeyStorage(ks *objutil.KeyStorage) Option { - return func(c *cfg) { - c.keyStorage = ks - } -} -- 2.45.3 From bb832702e3fe7675835603f6449ca1bf964149d3 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Mon, 10 Jul 2023 12:18:56 +0300 Subject: [PATCH 10/10] [#294] deletesvc: Drop cast Signed-off-by: Dmitrii Stepanov --- pkg/services/object/delete/service.go | 6 +++--- pkg/services/object/delete/util.go | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/pkg/services/object/delete/service.go b/pkg/services/object/delete/service.go index e208a298b..b74a4c7ba 100644 --- a/pkg/services/object/delete/service.go +++ b/pkg/services/object/delete/service.go @@ -72,9 +72,9 @@ func New(gs *getsvc.Service, opts ...Option) *Service { c := &cfg{ log: &logger.Logger{Logger: zap.L()}, - header: (*headSvcWrapper)(gs), - searcher: (*searchSvcWrapper)(ss), - placer: (*putSvcWrapper)(ps), + header: &headSvcWrapper{s: gs}, + searcher: &searchSvcWrapper{s: ss}, + placer: &putSvcWrapper{s: ps}, netInfo: ni, keyStorage: ks, } diff --git a/pkg/services/object/delete/util.go b/pkg/services/object/delete/util.go index b8e8e6324..439abca2b 100644 --- a/pkg/services/object/delete/util.go +++ b/pkg/services/object/delete/util.go @@ -11,11 +11,17 @@ import ( oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" ) -type headSvcWrapper getsvc.Service +type headSvcWrapper struct { + s *getsvc.Service +} -type searchSvcWrapper searchsvc.Service +type searchSvcWrapper struct { + s *searchsvc.Service +} -type putSvcWrapper putsvc.Service +type putSvcWrapper struct { + s *putsvc.Service +} type simpleIDWriter struct { ids []oid.ID @@ -30,7 +36,7 @@ func (w *headSvcWrapper) headAddress(ctx context.Context, exec *execCtx, addr oi p.WithRawFlag(true) p.WithAddress(addr) - err := (*getsvc.Service)(w).Head(ctx, p) + err := w.s.Head(ctx, p) if err != nil { return nil, err } @@ -94,7 +100,7 @@ func (w *searchSvcWrapper) splitMembers(ctx context.Context, exec *execCtx) ([]o p.WithContainerID(exec.containerID()) p.WithSearchFilters(fs) - err := (*searchsvc.Service)(w).Search(ctx, p) + err := w.s.Search(ctx, p) if err != nil { return nil, err } @@ -109,7 +115,7 @@ func (s *simpleIDWriter) WriteIDs(ids []oid.ID) error { } func (w *putSvcWrapper) put(ctx context.Context, exec *execCtx) (*oid.ID, error) { - streamer, err := (*putsvc.Service)(w).Put() + streamer, err := w.s.Put() if err != nil { return nil, err } -- 2.45.3