[#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 <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2021-02-09 18:03:43 +03:00 committed by Leonard Lyubich
parent ff814aec26
commit 97264acb26
2 changed files with 57 additions and 0 deletions

View file

@ -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

51
pkg/innerring/locode.go Normal file
View file

@ -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
}