cli: allow to provide network-specific node config file

Close #2978.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
This commit is contained in:
Anna Shaleva 2023-05-12 16:53:57 +03:00
parent abf3ef5af7
commit 4be9e4347a
5 changed files with 45 additions and 18 deletions

View file

@ -35,9 +35,9 @@ const RPCEndpointFlag = "rpc-endpoint"
// Network is a set of flags for choosing the network to operate on // Network is a set of flags for choosing the network to operate on
// (privnet/mainnet/testnet). // (privnet/mainnet/testnet).
var Network = []cli.Flag{ var Network = []cli.Flag{
cli.BoolFlag{Name: "privnet, p", Usage: "use private network configuration"}, cli.BoolFlag{Name: "privnet, p", Usage: "use private network configuration (if --config-file option is not specified)"},
cli.BoolFlag{Name: "mainnet, m", Usage: "use mainnet network configuration"}, cli.BoolFlag{Name: "mainnet, m", Usage: "use mainnet network configuration (if --config-file option is not specified)"},
cli.BoolFlag{Name: "testnet, t", Usage: "use testnet network configuration"}, cli.BoolFlag{Name: "testnet, t", Usage: "use testnet network configuration (if --config-file option is not specified)"},
cli.BoolFlag{Name: "unittest", Hidden: true}, cli.BoolFlag{Name: "unittest", Hidden: true},
} }
@ -63,7 +63,14 @@ var Historic = cli.StringFlag{
// Config is a flag for commands that use node configuration. // Config is a flag for commands that use node configuration.
var Config = cli.StringFlag{ var Config = cli.StringFlag{
Name: "config-path", Name: "config-path",
Usage: "path to directory with configuration files", Usage: "path to directory with per-network configuration files (may be overridden by --config-file option for the configuration file)",
}
// ConfigFile is a flag for commands that use node configuration and provide
// path to the specific config file instead of config path.
var ConfigFile = cli.StringFlag{
Name: "config-file",
Usage: "path to the node configuration file (overrides --config-path option)",
} }
// Debug is a flag for commands that allow node in debug mode usage. // Debug is a flag for commands that allow node in debug mode usage.
@ -152,7 +159,11 @@ func GetRPCWithInvoker(gctx context.Context, ctx *cli.Context, signers []transac
// GetConfigFromContext looks at the path and the mode flags in the given config and // GetConfigFromContext looks at the path and the mode flags in the given config and
// returns an appropriate config. // returns an appropriate config.
func GetConfigFromContext(ctx *cli.Context) (config.Config, error) { func GetConfigFromContext(ctx *cli.Context) (config.Config, error) {
configPath := "./config" var configFile = ctx.String("config-file")
if len(configFile) != 0 {
return config.LoadFile(configFile)
}
var configPath = "./config"
if argCp := ctx.String("config-path"); argCp != "" { if argCp := ctx.String("config-path"); argCp != "" {
configPath = argCp configPath = argCp
} }

View file

@ -34,7 +34,7 @@ import (
// NewCommands returns 'node' command. // NewCommands returns 'node' command.
func NewCommands() []cli.Command { func NewCommands() []cli.Command {
cfgFlags := []cli.Flag{options.Config} cfgFlags := []cli.Flag{options.Config, options.ConfigFile}
cfgFlags = append(cfgFlags, options.Network...) cfgFlags = append(cfgFlags, options.Network...)
var cfgWithCountFlags = make([]cli.Flag, len(cfgFlags)) var cfgWithCountFlags = make([]cli.Flag, len(cfgFlags))
copy(cfgWithCountFlags, cfgFlags) copy(cfgWithCountFlags, cfgFlags)
@ -85,7 +85,7 @@ func NewCommands() []cli.Command {
{ {
Name: "node", Name: "node",
Usage: "start a NeoGo node", Usage: "start a NeoGo node",
UsageText: "neo-go node [--config-path path] [-d] [-p/-m/-t]", UsageText: "neo-go node [--config-path path] [-d] [-p/-m/-t] [--config-file file]",
Action: startServer, Action: startServer,
Flags: cfgFlags, Flags: cfgFlags,
}, },
@ -96,21 +96,21 @@ func NewCommands() []cli.Command {
{ {
Name: "dump", Name: "dump",
Usage: "dump blocks (starting with block #1) to the file", Usage: "dump blocks (starting with block #1) to the file",
UsageText: "neo-go db dump -o file [-s start] [-c count] [--config-path path] [-p/-m/-t]", UsageText: "neo-go db dump -o file [-s start] [-c count] [--config-path path] [-p/-m/-t] [--config-file file]",
Action: dumpDB, Action: dumpDB,
Flags: cfgCountOutFlags, Flags: cfgCountOutFlags,
}, },
{ {
Name: "restore", Name: "restore",
Usage: "restore blocks from the file", Usage: "restore blocks from the file",
UsageText: "neo-go db restore -i file [--dump] [-n] [-c count] [--config-path path] [-p/-m/-t]", UsageText: "neo-go db restore -i file [--dump] [-n] [-c count] [--config-path path] [-p/-m/-t] [--config-file file]",
Action: restoreDB, Action: restoreDB,
Flags: cfgCountInFlags, Flags: cfgCountInFlags,
}, },
{ {
Name: "reset", Name: "reset",
Usage: "reset database to the previous state", Usage: "reset database to the previous state",
UsageText: "neo-go db reset --height height [--config-path path] [-p/-m/-t]", UsageText: "neo-go db reset --height height [--config-path path] [-p/-m/-t] [--config-file file]",
Action: resetDB, Action: resetDB,
Flags: cfgHeightFlags, Flags: cfgHeightFlags,
}, },

View file

@ -30,13 +30,25 @@ func init() {
} }
func TestGetConfigFromContext(t *testing.T) { func TestGetConfigFromContext(t *testing.T) {
set := flag.NewFlagSet("flagSet", flag.ExitOnError) t.Run("config-path", func(t *testing.T) {
set.String("config-path", "../../config", "") set := flag.NewFlagSet("flagSet", flag.ExitOnError)
set.Bool("testnet", true, "") set.String("config-path", "../../config", "")
ctx := cli.NewContext(cli.NewApp(), set, nil) set.Bool("testnet", true, "")
cfg, err := options.GetConfigFromContext(ctx) ctx := cli.NewContext(cli.NewApp(), set, nil)
require.NoError(t, err) cfg, err := options.GetConfigFromContext(ctx)
require.Equal(t, netmode.TestNet, cfg.ProtocolConfiguration.Magic) require.NoError(t, err)
require.Equal(t, netmode.TestNet, cfg.ProtocolConfiguration.Magic)
})
t.Run("config-file", func(t *testing.T) {
set := flag.NewFlagSet("flagSet", flag.ExitOnError)
set.String("config-path", "../../config", "")
set.Bool("testnet", true, "")
set.String("config-file", "../../config/protocol.testnet.yml", "")
ctx := cli.NewContext(cli.NewApp(), set, nil)
cfg, err := options.GetConfigFromContext(ctx)
require.NoError(t, err)
require.Equal(t, netmode.TestNet, cfg.ProtocolConfiguration.Magic)
})
} }
func TestHandleLoggingParams(t *testing.T) { func TestHandleLoggingParams(t *testing.T) {

View file

@ -13,7 +13,7 @@ import (
// NewCommands returns 'vm' command. // NewCommands returns 'vm' command.
func NewCommands() []cli.Command { func NewCommands() []cli.Command {
cfgFlags := []cli.Flag{options.Config} cfgFlags := []cli.Flag{options.Config, options.ConfigFile}
cfgFlags = append(cfgFlags, options.Network...) cfgFlags = append(cfgFlags, options.Network...)
return []cli.Command{{ return []cli.Command{{
Name: "vm", Name: "vm",

View file

@ -35,6 +35,10 @@ If you want to use some non-default configuration directory path, specify
The file loaded is chosen automatically depending on network mode flag. The file loaded is chosen automatically depending on network mode flag.
Or just provide path to the configuration file using `--config-file` flag:
`./bin/neo-go node --config-file /user/yourConfigPath/yourConfigFile.yml`
Refer to the [node configuration documentation](./node-configuration.md) for Refer to the [node configuration documentation](./node-configuration.md) for
detailed configuration file description. detailed configuration file description.