From 86b9aefcaee7be0995ee391e78850f1404943825 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Wed, 16 Sep 2020 10:45:08 +0300 Subject: [PATCH] [#28] Make storage node configurable To run storage node at dev-env environment it should have configurable parameters. To keep `cfg` structures we can read configuration from env and yml config file with viper and parse values such as script hashes, fees, keys into `cfg` structures. Signed-off-by: Alex Vanin --- cmd/neofs-node/accounting.go | 10 +-- cmd/neofs-node/config.go | 123 +++++++++++++++++++++++++++-------- cmd/neofs-node/container.go | 10 +-- cmd/neofs-node/grpc.go | 2 +- cmd/neofs-node/main.go | 6 +- cmd/neofs-node/morph.go | 14 ++-- go.mod | 2 +- go.sum | Bin 66973 -> 57836 bytes 8 files changed, 121 insertions(+), 46 deletions(-) diff --git a/cmd/neofs-node/accounting.go b/cmd/neofs-node/accounting.go index e9991890..5e99f2cc 100644 --- a/cmd/neofs-node/accounting.go +++ b/cmd/neofs-node/accounting.go @@ -1,7 +1,6 @@ package main import ( - "github.com/nspcc-dev/neo-go/pkg/util" accountingGRPC "github.com/nspcc-dev/neofs-api-go/v2/accounting/grpc" "github.com/nspcc-dev/neofs-api-go/v2/session" "github.com/nspcc-dev/neofs-node/pkg/morph/client" @@ -17,10 +16,11 @@ func initAccountingService(c *cfg) { initMorphComponents(c) } - u160, err := util.Uint160DecodeStringLE(c.cfgAccounting.scriptHash) - fatalOnErr(err) - - staticClient, err := client.NewStatic(c.cfgMorph.client, u160, c.cfgAccounting.fee) + staticClient, err := client.NewStatic( + c.cfgMorph.client, + c.cfgAccounting.scriptHash, + c.cfgAccounting.fee, + ) fatalOnErr(err) balanceClient, err := balance.New(staticClient) diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index 8d2c2b77..52e95ddc 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -4,18 +4,47 @@ import ( "context" "crypto/ecdsa" "net" + "strings" "sync" "github.com/nspcc-dev/neo-go/pkg/util" crypto "github.com/nspcc-dev/neofs-crypto" + "github.com/nspcc-dev/neofs-node/misc" "github.com/nspcc-dev/neofs-node/pkg/morph/client" tokenStorage "github.com/nspcc-dev/neofs-node/pkg/services/session/storage" + "github.com/spf13/viper" "google.golang.org/grpc" ) +const ( + // config keys for cfgNodeInfo + cfgNodeKey = "node.key" + cfgBootstrapAddress = "node.address" + + // config keys for cfgGRPC + cfgListenAddress = "grpc.endpoint" + + // config keys for cfgMorph + cfgMorphRPCAddress = "morph.endpoint" + + // config keys for cfgAccounting + cfgAccountingContract = "accounting.scripthash" + cfgAccountingFee = "accounting.fee" + + // config keys for cfgNetmap + cfgNetmapContract = "netmap.scripthash" + cfgNetmapFee = "netmap.fee" + + // config keys for cfgContainer + cfgContainerContract = "container.scripthash" + cfgContainerFee = "container.fee" +) + type cfg struct { ctx context.Context + viper *viper.Viper + wg *sync.WaitGroup key *ecdsa.PrivateKey @@ -36,33 +65,29 @@ type cfg struct { } type cfgGRPC struct { - endpoint string - listener net.Listener server *grpc.Server } type cfgMorph struct { - endpoint string - client *client.Client } type cfgAccounting struct { - scriptHash string + scriptHash util.Uint160 fee util.Fixed8 } type cfgContainer struct { - scriptHash string + scriptHash util.Uint160 fee util.Fixed8 } type cfgNetmap struct { - scriptHash string + scriptHash util.Uint160 fee util.Fixed8 } @@ -71,8 +96,6 @@ type BootstrapType uint32 type cfgNodeInfo struct { bootType BootstrapType - - address string } const ( @@ -81,34 +104,82 @@ const ( RelayNode ) -func defaultCfg() *cfg { - key, err := crypto.LoadPrivateKey("Kwk6k2eC3L3QuPvD8aiaNyoSXgQ2YL1bwS5CP1oKoA9waeAze97s") +func initCfg(path string) *cfg { + viperCfg := initViper(path) + + key, err := crypto.LoadPrivateKey(viperCfg.GetString(cfgNodeKey)) + fatalOnErr(err) + + u160Accounting, err := util.Uint160DecodeStringLE( + viperCfg.GetString(cfgAccountingContract)) + fatalOnErr(err) + + u160Netmap, err := util.Uint160DecodeStringLE( + viperCfg.GetString(cfgNetmapContract)) + fatalOnErr(err) + + u160Container, err := util.Uint160DecodeStringLE( + viperCfg.GetString(cfgContainerContract)) fatalOnErr(err) return &cfg{ - ctx: context.Background(), - wg: new(sync.WaitGroup), - key: key, - cfgGRPC: cfgGRPC{ - endpoint: "127.0.0.1:50501", - }, - cfgMorph: cfgMorph{ - endpoint: "http://morph_chain.localtest.nspcc.ru:30333/", - }, + ctx: context.Background(), + viper: viperCfg, + wg: new(sync.WaitGroup), + key: key, cfgAccounting: cfgAccounting{ - scriptHash: "1aeefe1d0dfade49740fff779c02cd4a0538ffb1", - fee: util.Fixed8(1), + scriptHash: u160Accounting, + fee: util.Fixed8(viperCfg.GetInt(cfgAccountingFee)), }, cfgContainer: cfgContainer{ - scriptHash: "9d2ca84d7fb88213c4baced5a6ed4dc402309039", - fee: util.Fixed8(1), + scriptHash: u160Container, + fee: util.Fixed8(viperCfg.GetInt(cfgContainerFee)), }, cfgNetmap: cfgNetmap{ - scriptHash: "75194459637323ea8837d2afe8225ec74a5658c3", - fee: util.Fixed8(1), + scriptHash: u160Netmap, + fee: util.Fixed8(viperCfg.GetInt(cfgNetmapFee)), }, cfgNodeInfo: cfgNodeInfo{ bootType: StorageNode, }, } } + +func initViper(path string) *viper.Viper { + v := viper.New() + + v.SetEnvPrefix(misc.Prefix) + v.AutomaticEnv() + v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + + v.SetDefault("app.name", misc.NodeName) + v.SetDefault("app.version", misc.Version) + + defaultConfiguration(v) + + if path != "" { + v.SetConfigFile(path) + v.SetConfigType("yml") + fatalOnErr(v.ReadInConfig()) + } + + return v +} + +func defaultConfiguration(v *viper.Viper) { + // fixme: all hardcoded private keys must be removed + v.SetDefault(cfgNodeKey, "Kwk6k2eC3L3QuPvD8aiaNyoSXgQ2YL1bwS5CP1oKoA9waeAze97s") + v.SetDefault(cfgBootstrapAddress, "") // address to bootstrap with + + v.SetDefault(cfgMorphRPCAddress, "http://morph_chain.localtest.nspcc.ru:30333/") + v.SetDefault(cfgListenAddress, "127.0.0.1:50501") // listen address + + v.SetDefault(cfgAccountingContract, "1aeefe1d0dfade49740fff779c02cd4a0538ffb1") + v.SetDefault(cfgAccountingFee, "1") + + v.SetDefault(cfgContainerContract, "9d2ca84d7fb88213c4baced5a6ed4dc402309039") + v.SetDefault(cfgContainerFee, "1") + + v.SetDefault(cfgNetmapContract, "75194459637323ea8837d2afe8225ec74a5658c3") + v.SetDefault(cfgNetmapFee, "1") +} diff --git a/cmd/neofs-node/container.go b/cmd/neofs-node/container.go index 59b69c2c..40618eaf 100644 --- a/cmd/neofs-node/container.go +++ b/cmd/neofs-node/container.go @@ -1,7 +1,6 @@ package main import ( - "github.com/nspcc-dev/neo-go/pkg/util" containerGRPC "github.com/nspcc-dev/neofs-api-go/v2/container/grpc" "github.com/nspcc-dev/neofs-api-go/v2/session" "github.com/nspcc-dev/neofs-node/pkg/morph/client" @@ -12,10 +11,11 @@ import ( ) func initContainerService(c *cfg) { - u160, err := util.Uint160DecodeStringLE(c.cfgContainer.scriptHash) - fatalOnErr(err) - - staticClient, err := client.NewStatic(c.cfgMorph.client, u160, c.cfgContainer.fee) + staticClient, err := client.NewStatic( + c.cfgMorph.client, + c.cfgContainer.scriptHash, + c.cfgContainer.fee, + ) fatalOnErr(err) cnrClient, err := container.New(staticClient) diff --git a/cmd/neofs-node/grpc.go b/cmd/neofs-node/grpc.go index 4653e391..be28a430 100644 --- a/cmd/neofs-node/grpc.go +++ b/cmd/neofs-node/grpc.go @@ -10,7 +10,7 @@ import ( func initGRPC(c *cfg) { var err error - c.cfgGRPC.listener, err = net.Listen("tcp", c.cfgGRPC.endpoint) + c.cfgGRPC.listener, err = net.Listen("tcp", c.viper.GetString(cfgListenAddress)) fatalOnErr(err) c.cfgGRPC.server = grpc.NewServer() diff --git a/cmd/neofs-node/main.go b/cmd/neofs-node/main.go index e6fd51c3..74c8877a 100644 --- a/cmd/neofs-node/main.go +++ b/cmd/neofs-node/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "log" @@ -14,7 +15,10 @@ func fatalOnErr(err error) { } func main() { - c := defaultCfg() + configFile := flag.String("config", "", "path to config") + flag.Parse() + + c := initCfg(*configFile) init_(c) diff --git a/cmd/neofs-node/morph.go b/cmd/neofs-node/morph.go index 0c5063c0..9ad22450 100644 --- a/cmd/neofs-node/morph.go +++ b/cmd/neofs-node/morph.go @@ -1,7 +1,6 @@ package main import ( - "github.com/nspcc-dev/neo-go/pkg/util" crypto "github.com/nspcc-dev/neofs-crypto" "github.com/nspcc-dev/neofs-node/pkg/morph/client" "github.com/nspcc-dev/neofs-node/pkg/morph/client/netmap" @@ -11,16 +10,17 @@ import ( func initMorphComponents(c *cfg) { var err error - c.cfgMorph.client, err = client.New(c.key, c.cfgMorph.endpoint) + c.cfgMorph.client, err = client.New(c.key, c.viper.GetString(cfgMorphRPCAddress)) fatalOnErr(err) } func bootstrapNode(c *cfg) { if c.cfgNodeInfo.bootType == StorageNode { - u160, err := util.Uint160DecodeStringLE(c.cfgNetmap.scriptHash) - fatalOnErr(err) - - staticClient, err := client.NewStatic(c.cfgMorph.client, u160, c.cfgContainer.fee) + staticClient, err := client.NewStatic( + c.cfgMorph.client, + c.cfgNetmap.scriptHash, + c.cfgContainer.fee, + ) fatalOnErr(err) cli, err := netmap.New(staticClient) @@ -30,7 +30,7 @@ func bootstrapNode(c *cfg) { fatalOnErr(err) peerInfo := new(netmap.NodeInfo) - peerInfo.SetAddress(c.cfgNodeInfo.address) + peerInfo.SetAddress(c.viper.GetString(cfgBootstrapAddress)) peerInfo.SetPublicKey(crypto.MarshalPublicKey(&c.key.PublicKey)) // todo: add attributes as opts diff --git a/go.mod b/go.mod index f6f94549..20077c5f 100644 --- a/go.mod +++ b/go.mod @@ -35,4 +35,4 @@ require ( ) // Used for debug reasons -replace github.com/nspcc-dev/neofs-api-go => ../neofs-api-go +// replace github.com/nspcc-dev/neofs-api-go => ../neofs-api-go diff --git a/go.sum b/go.sum index 1f49860d7dac02de404f73ab333ed0dfbe53057b..f5e29c900651f2bda29376b178ed2196b87f22eb 100644 GIT binary patch delta 671 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