From 43a7b99f67e1c70aa9fd03f798ff64d0625b9c29 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 26 Jun 2024 16:31:53 +0200 Subject: [PATCH] refactor: add `serverv2.Execute` helper (#20773) --- server/cmd/execute.go | 14 ++++++++++---- server/v2/commands.go | 29 ++++++++++++++++++++++++----- server/v2/server.go | 1 - simapp/v2/simdv2/main.go | 5 ++--- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/server/cmd/execute.go b/server/cmd/execute.go index cf8e7c009f..88003c6fed 100644 --- a/server/cmd/execute.go +++ b/server/cmd/execute.go @@ -2,10 +2,11 @@ package cmd import ( "context" + "strings" - cmtcli "github.com/cometbft/cometbft/libs/cli" "github.com/rs/zerolog" "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -26,12 +27,17 @@ func Execute(rootCmd *cobra.Command, envPrefix, defaultHome string) error { ctx := CreateExecuteContext(context.Background()) rootCmd.PersistentFlags().String(flags.FlagLogLevel, zerolog.InfoLevel.String(), "The logging level (trace|debug|info|warn|error|fatal|panic|disabled or '*:,:')") - // NOTE: The default logger is only checking for the "json" value, any other value will default to plain text. rootCmd.PersistentFlags().String(flags.FlagLogFormat, "plain", "The logging format (json|plain)") rootCmd.PersistentFlags().Bool(flags.FlagLogNoColor, false, "Disable colored logs") + rootCmd.PersistentFlags().StringP(flags.FlagHome, "", defaultHome, "directory for config and data") + rootCmd.PersistentFlags().Bool(server.FlagTrace, false, "print out full stack trace on errors") - executor := cmtcli.PrepareBaseCmd(rootCmd, envPrefix, defaultHome) - return executor.ExecuteContext(ctx) + // update the global viper with the root command's configuration + viper.SetEnvPrefix(envPrefix) + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) + viper.AutomaticEnv() + + return rootCmd.ExecuteContext(ctx) } // CreateExecuteContext returns a base Context with server and client context diff --git a/server/v2/commands.go b/server/v2/commands.go index a6059388ad..2cddedbc4b 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -7,14 +7,32 @@ import ( "os" "os/signal" "path/filepath" + "strings" "syscall" "github.com/spf13/cobra" + "github.com/spf13/viper" "cosmossdk.io/core/transaction" "cosmossdk.io/log" ) +// Execute executes the root command of an application. +// It handles adding core CLI flags, specifically the logging flags. +func Execute(rootCmd *cobra.Command, envPrefix, defaultHome string) error { + rootCmd.PersistentFlags().String(FlagLogLevel, "info", "The logging level (trace|debug|info|warn|error|fatal|panic|disabled or '*:,:')") + rootCmd.PersistentFlags().String(FlagLogFormat, "plain", "The logging format (json|plain)") + rootCmd.PersistentFlags().Bool(FlagLogNoColor, false, "Disable colored logs") + rootCmd.PersistentFlags().StringP(FlagHome, "", defaultHome, "directory for config and data") + + // update the global viper with the root command's configuration + viper.SetEnvPrefix(envPrefix) + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) + viper.AutomaticEnv() + + return rootCmd.Execute() +} + func Commands(rootCmd *cobra.Command, newApp AppCreator[transaction.Tx], logger log.Logger, components ...ServerComponent[transaction.Tx]) (CLIConfig, error) { if len(components) == 0 { return CLIConfig{}, errors.New("no components provided") @@ -90,8 +108,7 @@ func AddCommands(rootCmd *cobra.Command, newApp AppCreator[transaction.Tx], logg return err } - err = configHandle(server, home, cmd) - if err != nil { + if err = configHandle(server, home, cmd); err != nil { return err } @@ -109,14 +126,16 @@ func AddCommands(rootCmd *cobra.Command, newApp AppCreator[transaction.Tx], logg // configHandle writes the default config to the home directory if it does not exist and sets the server context func configHandle(s *Server, home string, cmd *cobra.Command) error { + configDir := filepath.Join(home, "config") + // we need to check app.toml as the config folder can already exist for the client.toml - if _, err := os.Stat(filepath.Join(home, "config", "app.toml")); os.IsNotExist(err) { - if err = s.WriteConfig(filepath.Join(home, "config")); err != nil { + if _, err := os.Stat(filepath.Join(configDir, "app.toml")); os.IsNotExist(err) { + if err = s.WriteConfig(configDir); err != nil { return err } } - viper, err := ReadConfig(filepath.Join(home, "config")) + viper, err := ReadConfig(configDir) if err != nil { return err } diff --git a/server/v2/server.go b/server/v2/server.go index e078957877..f565c6a4c1 100644 --- a/server/v2/server.go +++ b/server/v2/server.go @@ -46,7 +46,6 @@ var _ ServerComponent[transaction.Tx] = (*Server)(nil) // Configs returns a viper instance of the config file func ReadConfig(configPath string) (*viper.Viper, error) { v := viper.New() - v.SetConfigType("toml") v.SetConfigName("config") v.AddConfigPath(configPath) diff --git a/simapp/v2/simdv2/main.go b/simapp/v2/simdv2/main.go index c327f3e84e..5766d6e9d8 100644 --- a/simapp/v2/simdv2/main.go +++ b/simapp/v2/simdv2/main.go @@ -4,15 +4,14 @@ import ( "fmt" "os" + serverv2 "cosmossdk.io/server/v2" "cosmossdk.io/simapp/v2" "cosmossdk.io/simapp/v2/simdv2/cmd" - - svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" // TODO(@julienrbrt), no need to abstract this. ) func main() { rootCmd := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, "", simapp.DefaultNodeHome); err != nil { + if err := serverv2.Execute(rootCmd, "", simapp.DefaultNodeHome); err != nil { fmt.Fprintln(rootCmd.OutOrStderr(), err) os.Exit(1) }