From 97264acb26489440caf3abc80a441066c8d358fb Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Tue, 9 Feb 2021 18:03:43 +0300 Subject: [PATCH] [#316] ir: Use LOCODE validator as NodeValidator in Netmap processor Implement DB interface required by LOCODE validator on new wrapper over the LOCODE Bolt DB (Record on new wrapper over LOCODE Bolt DB entries). Construct LOCODE validator and pass it to Netmap processor's constructor as NodeValidator parameter. Thus, candidates for a network map must set LOCODE attribute for which there is an entry in the NeoFS location database. Signed-off-by: Leonard Lyubich --- pkg/innerring/innerring.go | 6 +++++ pkg/innerring/locode.go | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 pkg/innerring/locode.go diff --git a/pkg/innerring/innerring.go b/pkg/innerring/innerring.go index 08b5936ef..1c6425dc9 100644 --- a/pkg/innerring/innerring.go +++ b/pkg/innerring/innerring.go @@ -373,6 +373,11 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error settlement.WithLogger(server.log), ) + locodeValidator, err := server.newLocodeValidator(cfg) + if err != nil { + return nil, err + } + // create netmap processor netmapProcessor, err := netmap.New(&netmap.Params{ Log: log, @@ -391,6 +396,7 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper) (*Server, error AuditSettlementsHandler: server.onlyActiveEventHandler( settlementProcessor.HandleAuditEvent, ), + NodeValidator: locodeValidator, }) if err != nil { return nil, err diff --git a/pkg/innerring/locode.go b/pkg/innerring/locode.go new file mode 100644 index 000000000..09c038bf9 --- /dev/null +++ b/pkg/innerring/locode.go @@ -0,0 +1,51 @@ +package innerring + +import ( + "github.com/nspcc-dev/neofs-node/pkg/innerring/processors/netmap" + irlocode "github.com/nspcc-dev/neofs-node/pkg/innerring/processors/netmap/nodevalidation/locode" + "github.com/nspcc-dev/neofs-node/pkg/util/locode" + locodedb "github.com/nspcc-dev/neofs-node/pkg/util/locode/db" + locodebolt "github.com/nspcc-dev/neofs-node/pkg/util/locode/db/boltdb" + "github.com/spf13/viper" +) + +func (s *Server) newLocodeValidator(cfg *viper.Viper) (netmap.NodeValidator, error) { + locodeDB := locodebolt.New(locodebolt.Prm{ + Path: cfg.GetString("locode.db.path"), + }) + + s.registerStarter(locodeDB.Open) + s.registerIOCloser(locodeDB) + + return irlocode.New(irlocode.Prm{ + DB: (*locodeBoltDBWrapper)(locodeDB), + }), nil +} + +type locodeBoltEntryWrapper struct { + *locodedb.Key + *locodedb.Record +} + +func (l *locodeBoltEntryWrapper) LocationName() string { + return l.Record.CityName() +} + +type locodeBoltDBWrapper locodebolt.DB + +func (l *locodeBoltDBWrapper) Get(lc *locode.LOCODE) (irlocode.Record, error) { + key, err := locodedb.NewKey(*lc) + if err != nil { + return nil, err + } + + rec, err := (*locodebolt.DB)(l).Get(*key) + if err != nil { + return nil, err + } + + return &locodeBoltEntryWrapper{ + Key: key, + Record: rec, + }, nil +}