refactor(server/v2): kill viper from server components (#21663)
This commit is contained in:
parent
6afa3c1a13
commit
88cfebe15b
@ -12,7 +12,6 @@ import (
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/metadata"
|
||||
@ -47,10 +46,10 @@ func New[T transaction.Tx](cfgOptions ...CfgOption) *Server[T] {
|
||||
|
||||
// Init returns a correctly configured and initialized gRPC server.
|
||||
// Note, the caller is responsible for starting the server.
|
||||
func (s *Server[T]) Init(appI serverv2.AppI[T], v *viper.Viper, logger log.Logger) error {
|
||||
cfg := s.Config().(*Config)
|
||||
if v != nil {
|
||||
if err := serverv2.UnmarshalSubConfig(v, s.Name(), &cfg); err != nil {
|
||||
func (s *Server[T]) Init(appI serverv2.AppI[T], cfg map[string]any, logger log.Logger) error {
|
||||
serverCfg := s.Config().(*Config)
|
||||
if len(cfg) > 0 {
|
||||
if err := serverv2.UnmarshalSubConfig(cfg, s.Name(), &serverCfg); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
}
|
||||
@ -58,8 +57,8 @@ func (s *Server[T]) Init(appI serverv2.AppI[T], v *viper.Viper, logger log.Logge
|
||||
|
||||
grpcSrv := grpc.NewServer(
|
||||
grpc.ForceServerCodec(newProtoCodec(appI.InterfaceRegistry()).GRPCCodec()),
|
||||
grpc.MaxSendMsgSize(cfg.MaxSendMsgSize),
|
||||
grpc.MaxRecvMsgSize(cfg.MaxRecvMsgSize),
|
||||
grpc.MaxSendMsgSize(serverCfg.MaxSendMsgSize),
|
||||
grpc.MaxRecvMsgSize(serverCfg.MaxRecvMsgSize),
|
||||
grpc.UnknownServiceHandler(
|
||||
makeUnknownServiceHandler(methodsMap, appI.GetAppManager()),
|
||||
),
|
||||
@ -69,7 +68,7 @@ func (s *Server[T]) Init(appI serverv2.AppI[T], v *viper.Viper, logger log.Logge
|
||||
gogoreflection.Register(grpcSrv, slices.Collect(maps.Keys(methodsMap)), logger.With("sub-module", "grpc-reflection"))
|
||||
|
||||
s.grpcSrv = grpcSrv
|
||||
s.config = cfg
|
||||
s.config = serverCfg
|
||||
s.logger = logger.With(log.ModuleKey, s.Name())
|
||||
|
||||
return nil
|
||||
|
||||
@ -10,7 +10,6 @@ import (
|
||||
"github.com/cosmos/gogoproto/jsonpb"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/grpc-ecosystem/grpc-gateway/runtime"
|
||||
"github.com/spf13/viper"
|
||||
"google.golang.org/grpc"
|
||||
|
||||
"cosmossdk.io/core/transaction"
|
||||
@ -83,10 +82,10 @@ func (s *GRPCGatewayServer[T]) Config() any {
|
||||
return s.config
|
||||
}
|
||||
|
||||
func (s *GRPCGatewayServer[T]) Init(appI serverv2.AppI[transaction.Tx], v *viper.Viper, logger log.Logger) error {
|
||||
cfg := s.Config().(*Config)
|
||||
if v != nil {
|
||||
if err := serverv2.UnmarshalSubConfig(v, s.Name(), &cfg); err != nil {
|
||||
func (s *GRPCGatewayServer[T]) Init(appI serverv2.AppI[transaction.Tx], cfg map[string]any, logger log.Logger) error {
|
||||
serverCfg := s.Config().(*Config)
|
||||
if len(cfg) > 0 {
|
||||
if err := serverv2.UnmarshalSubConfig(cfg, s.Name(), &serverCfg); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
}
|
||||
@ -95,7 +94,7 @@ func (s *GRPCGatewayServer[T]) Init(appI serverv2.AppI[transaction.Tx], v *viper
|
||||
// appI.RegisterGRPCGatewayRoutes(s.GRPCGatewayRouter, s.GRPCSrv)
|
||||
|
||||
s.logger = logger
|
||||
s.config = cfg
|
||||
s.config = serverCfg
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -2,9 +2,6 @@ package cometbft
|
||||
|
||||
import (
|
||||
cmtcfg "github.com/cometbft/cometbft/config"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
serverv2 "cosmossdk.io/server/v2"
|
||||
)
|
||||
|
||||
// Config is the configuration for the CometBFT application
|
||||
@ -53,14 +50,3 @@ func OverwriteDefaultAppTomlConfig(newCfg *AppTomlConfig) CfgOption {
|
||||
cfg.AppTomlConfig = newCfg
|
||||
}
|
||||
}
|
||||
|
||||
func getConfigTomlFromViper(v *viper.Viper) *cmtcfg.Config {
|
||||
rootDir := v.GetString(serverv2.FlagHome)
|
||||
|
||||
conf := cmtcfg.DefaultConfig()
|
||||
if err := v.Unmarshal(conf); err != nil {
|
||||
return cmtcfg.DefaultConfig().SetRoot(rootDir)
|
||||
}
|
||||
|
||||
return conf.SetRoot(rootDir)
|
||||
}
|
||||
|
||||
@ -37,7 +37,6 @@ require (
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||
github.com/spf13/cobra v1.8.1
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/spf13/viper v1.19.0
|
||||
github.com/stretchr/testify v1.9.0
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117
|
||||
google.golang.org/grpc v1.66.1
|
||||
@ -150,6 +149,7 @@ require (
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.11.0 // indirect
|
||||
github.com/spf13/cast v1.7.0 // indirect
|
||||
github.com/spf13/viper v1.19.0 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/supranational/blst v0.3.13 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
||||
|
||||
@ -19,7 +19,6 @@ import (
|
||||
"github.com/cometbft/cometbft/proxy"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/log"
|
||||
@ -58,23 +57,31 @@ func New[T transaction.Tx](txCodec transaction.Codec[T], serverOptions ServerOpt
|
||||
}
|
||||
}
|
||||
|
||||
func (s *CometBFTServer[T]) Init(appI serverv2.AppI[T], v *viper.Viper, logger log.Logger) error {
|
||||
func (s *CometBFTServer[T]) Init(appI serverv2.AppI[T], cfg map[string]any, logger log.Logger) error {
|
||||
home, _ := cfg[serverv2.FlagHome].(string)
|
||||
|
||||
// get configs (app.toml + config.toml) from viper
|
||||
appTomlConfig := s.Config().(*AppTomlConfig)
|
||||
if v != nil {
|
||||
if err := serverv2.UnmarshalSubConfig(v, s.Name(), &appTomlConfig); err != nil {
|
||||
configTomlConfig := cmtcfg.DefaultConfig().SetRoot(home)
|
||||
if len(cfg) > 0 {
|
||||
if err := serverv2.UnmarshalSubConfig(cfg, s.Name(), &appTomlConfig); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
|
||||
if err := serverv2.UnmarshalSubConfig(cfg, "", &configTomlConfig); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
s.config = Config{
|
||||
ConfigTomlConfig: getConfigTomlFromViper(v),
|
||||
ConfigTomlConfig: configTomlConfig,
|
||||
AppTomlConfig: appTomlConfig,
|
||||
}
|
||||
|
||||
chainID := v.GetString(FlagChainID)
|
||||
chainID, _ := cfg[FlagChainID].(string)
|
||||
if chainID == "" {
|
||||
// fallback to genesis chain-id
|
||||
reader, err := os.Open(filepath.Join(v.GetString(serverv2.FlagHome), "config", "genesis.json"))
|
||||
reader, err := os.Open(filepath.Join(home, "config", "genesis.json"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
@ -112,7 +112,7 @@ func createStartCommand[T transaction.Tx](
|
||||
return err
|
||||
}
|
||||
|
||||
if err := server.Init(newApp(l, v), v, l); err != nil {
|
||||
if err := server.Init(newApp(l, v), v.AllSettings(), l); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@ -39,16 +39,19 @@ func ReadConfig(configPath string) (*viper.Viper, error) {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
// UnmarshalSubConfig unmarshals the given subconfig from the viper instance.
|
||||
// It unmarshals the config, env, flags into the target struct.
|
||||
// Use this instead of viper.Sub because viper does not unmarshal flags.
|
||||
func UnmarshalSubConfig(v *viper.Viper, subName string, target any) error {
|
||||
// UnmarshalSubConfig unmarshals the given (sub) config from the main config (given as a map) into the target.
|
||||
// If subName is empty, the main config is unmarshaled into the target.
|
||||
func UnmarshalSubConfig(cfg map[string]any, subName string, target any) error {
|
||||
var sub any
|
||||
for k, val := range v.AllSettings() {
|
||||
if k == subName {
|
||||
sub = val
|
||||
break
|
||||
if subName != "" {
|
||||
for k, val := range cfg {
|
||||
if k == subName {
|
||||
sub = val
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sub = cfg
|
||||
}
|
||||
|
||||
// Create a new decoder with custom decoding options
|
||||
|
||||
@ -31,16 +31,17 @@ func TestUnmarshalSubConfig(t *testing.T) {
|
||||
|
||||
v, err := serverv2.ReadConfig(configPath)
|
||||
require.NoError(t, err)
|
||||
cfg := v.AllSettings()
|
||||
|
||||
grpcConfig := grpc.DefaultConfig()
|
||||
err = serverv2.UnmarshalSubConfig(v, "grpc", &grpcConfig)
|
||||
err = serverv2.UnmarshalSubConfig(cfg, "grpc", &grpcConfig)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.True(t, grpc.DefaultConfig().Enable)
|
||||
require.False(t, grpcConfig.Enable)
|
||||
|
||||
storeConfig := store.Config{}
|
||||
err = serverv2.UnmarshalSubConfig(v, "store", &storeConfig)
|
||||
err = serverv2.UnmarshalSubConfig(cfg, "store", &storeConfig)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, *store.DefaultConfig(), storeConfig)
|
||||
}
|
||||
|
||||
@ -10,7 +10,6 @@ import (
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
||||
"cosmossdk.io/core/transaction"
|
||||
@ -23,7 +22,7 @@ type ServerComponent[T transaction.Tx] interface {
|
||||
|
||||
Start(context.Context) error
|
||||
Stop(context.Context) error
|
||||
Init(AppI[T], *viper.Viper, log.Logger) error
|
||||
Init(AppI[T], map[string]any, log.Logger) error
|
||||
}
|
||||
|
||||
// HasStartFlags is a server module that has start flags.
|
||||
@ -189,10 +188,10 @@ func (s *Server[T]) StartCmdFlags() *pflag.FlagSet {
|
||||
|
||||
// Init initializes all server components with the provided application, configuration, and logger.
|
||||
// It returns an error if any component fails to initialize.
|
||||
func (s *Server[T]) Init(appI AppI[T], v *viper.Viper, logger log.Logger) error {
|
||||
cfg := s.config
|
||||
if v != nil {
|
||||
if err := UnmarshalSubConfig(v, s.Name(), &cfg); err != nil {
|
||||
func (s *Server[T]) Init(appI AppI[T], cfg map[string]any, logger log.Logger) error {
|
||||
serverCfg := s.config
|
||||
if len(cfg) > 0 {
|
||||
if err := UnmarshalSubConfig(cfg, s.Name(), &serverCfg); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
}
|
||||
@ -200,14 +199,14 @@ func (s *Server[T]) Init(appI AppI[T], v *viper.Viper, logger log.Logger) error
|
||||
var components []ServerComponent[T]
|
||||
for _, mod := range s.components {
|
||||
mod := mod
|
||||
if err := mod.Init(appI, v, logger); err != nil {
|
||||
if err := mod.Init(appI, cfg, logger); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
components = append(components, mod)
|
||||
}
|
||||
|
||||
s.config = cfg
|
||||
s.config = serverCfg
|
||||
s.components = components
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -5,8 +5,6 @@ import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/log"
|
||||
serverv2 "cosmossdk.io/server/v2"
|
||||
@ -33,7 +31,7 @@ func (s *mockServer) Name() string {
|
||||
return s.name
|
||||
}
|
||||
|
||||
func (s *mockServer) Init(appI serverv2.AppI[transaction.Tx], v *viper.Viper, logger log.Logger) error {
|
||||
func (s *mockServer) Init(appI serverv2.AppI[transaction.Tx], cfg map[string]any, logger log.Logger) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@ -56,14 +56,15 @@ func TestServer(t *testing.T) {
|
||||
if err != nil {
|
||||
v = viper.New()
|
||||
}
|
||||
cfg := v.AllSettings()
|
||||
|
||||
logger := log.NewLogger(os.Stdout)
|
||||
grpcServer := grpc.New[transaction.Tx]()
|
||||
err = grpcServer.Init(&mockApp[transaction.Tx]{}, v, logger)
|
||||
err = grpcServer.Init(&mockApp[transaction.Tx]{}, cfg, logger)
|
||||
require.NoError(t, err)
|
||||
|
||||
storeServer := store.New[transaction.Tx](nil /* nil appCreator as not using CLI commands */)
|
||||
err = storeServer.Init(&mockApp[transaction.Tx]{}, v, logger)
|
||||
err = storeServer.Init(&mockApp[transaction.Tx]{}, cfg, logger)
|
||||
require.NoError(t, err)
|
||||
|
||||
mockServer := &mockServer{name: "mock-server-1", ch: make(chan string, 100)}
|
||||
|
||||
@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/log"
|
||||
@ -24,14 +23,14 @@ func New[T transaction.Tx](appCreator serverv2.AppCreator[T]) *StoreComponent[T]
|
||||
return &StoreComponent[T]{appCreator: appCreator}
|
||||
}
|
||||
|
||||
func (s *StoreComponent[T]) Init(appI serverv2.AppI[T], v *viper.Viper, logger log.Logger) error {
|
||||
cfg := DefaultConfig()
|
||||
if v != nil {
|
||||
if err := serverv2.UnmarshalSubConfig(v, s.Name(), &cfg); err != nil {
|
||||
func (s *StoreComponent[T]) Init(appI serverv2.AppI[T], cfg map[string]any, logger log.Logger) error {
|
||||
serverCfg := DefaultConfig()
|
||||
if len(cfg) > 0 {
|
||||
if err := serverv2.UnmarshalSubConfig(cfg, s.Name(), &serverCfg); err != nil {
|
||||
return fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
}
|
||||
s.config = cfg
|
||||
s.config = serverCfg
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user