diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d284f6fc..94018e357 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Changelog for FrostFS Node ### Changed ### Fixed - Take network settings into account during netmap contract update (#100) +- Read config files from dir even if config file not provided via `--config` for node (#238) ### Removed ### Updated diff --git a/cmd/frostfs-node/config/configdir_test.go b/cmd/frostfs-node/config/configdir_test.go new file mode 100644 index 000000000..2c3255670 --- /dev/null +++ b/cmd/frostfs-node/config/configdir_test.go @@ -0,0 +1,24 @@ +package config + +import ( + "os" + "path" + "testing" + + "github.com/spf13/cast" + "github.com/stretchr/testify/require" +) + +func TestConfigDir(t *testing.T) { + dir := t.TempDir() + + cfgFileName0 := path.Join(dir, "cfg_00.json") + cfgFileName1 := path.Join(dir, "cfg_01.yml") + + require.NoError(t, os.WriteFile(cfgFileName0, []byte(`{"storage":{"shard_pool_size":15}}`), 0777)) + require.NoError(t, os.WriteFile(cfgFileName1, []byte("logger:\n level: debug"), 0777)) + + c := New(Prm{}, WithConfigDir(dir)) + require.Equal(t, "debug", cast.ToString(c.Sub("logger").Value("level"))) + require.EqualValues(t, 15, cast.ToUint32(c.Sub("storage").Value("shard_pool_size"))) +} diff --git a/config/example/node.env b/config/example/node.env index 9a1a8b052..a4088f75a 100644 --- a/config/example/node.env +++ b/config/example/node.env @@ -187,4 +187,4 @@ FROSTFS_STORAGE_SHARD_1_GC_REMOVER_SLEEP_INTERVAL=5m FROSTFS_TRACING_ENABLED=true FROSTFS_TRACING_ENDPOINT="localhost" -FROSTFS_TRACING_EXPORTER="otlp_grpc" \ No newline at end of file +FROSTFS_TRACING_EXPORTER="otlp_grpc" diff --git a/config/example/node.yaml b/config/example/node.yaml index e3b41d413..0d71f0fd2 100644 --- a/config/example/node.yaml +++ b/config/example/node.yaml @@ -219,4 +219,3 @@ tracing: enabled: true exporter: "otlp_grpc" endpoint: "localhost" - \ No newline at end of file diff --git a/internal/logs/logs.go b/internal/logs/logs.go index 83acedfb4..062538747 100644 --- a/internal/logs/logs.go +++ b/internal/logs/logs.go @@ -490,7 +490,7 @@ const ( NetmapCantInvokeNetmapUpdatePeer = "can't invoke netmap.UpdatePeer" // Error in ../node/pkg/innerring/processors/netmap/process_peers.go NetmapNonAlphabetModeIgnoreRemoveNodeFromSubnetNotification = "non alphabet mode, ignore remove node from subnet notification" // Info in ../node/pkg/innerring/processors/netmap/process_peers.go NetmapCouldNotGetNetworkMapCandidates = "could not get network map candidates" // Warn in ../node/pkg/innerring/processors/netmap/process_peers.go - NetmapCouldNotUnmarshalSubnetId = "could not unmarshal subnet id" // Warn in ../node/pkg/innerring/processors/netmap/process_peers.go + NetmapCouldNotUnmarshalSubnetID = "could not unmarshal subnet id" // Warn in ../node/pkg/innerring/processors/netmap/process_peers.go NetmapGotZeroSubnetInRemoveNodeNotification = "got zero subnet in remove node notification" // Warn in ../node/pkg/innerring/processors/netmap/process_peers.go NetmapCouldNotIterateOverSubnetworksOfTheNode = "could not iterate over subnetworks of the node" // Warn in ../node/pkg/innerring/processors/netmap/process_peers.go NetmapCouldNotInvokeNetmapUpdateState = "could not invoke netmap.UpdateState" // Error in ../node/pkg/innerring/processors/netmap/process_peers.go diff --git a/pkg/innerring/processors/netmap/process_peers.go b/pkg/innerring/processors/netmap/process_peers.go index ffaad3b4e..130d08568 100644 --- a/pkg/innerring/processors/netmap/process_peers.go +++ b/pkg/innerring/processors/netmap/process_peers.go @@ -159,7 +159,7 @@ func (np *Processor) processRemoveSubnetNode(ev subnetEvent.RemoveNode) { err = subnetToRemoveFrom.Unmarshal(rawSubnet) if err != nil { - np.log.Warn(logs.NetmapCouldNotUnmarshalSubnetId, + np.log.Warn(logs.NetmapCouldNotUnmarshalSubnetID, zap.Error(err), ) return diff --git a/pkg/util/config/dir.go b/pkg/util/config/dir.go index a74992d19..0379fe268 100644 --- a/pkg/util/config/dir.go +++ b/pkg/util/config/dir.go @@ -1,6 +1,7 @@ package config import ( + "fmt" "os" "path" @@ -20,7 +21,7 @@ func ReadConfigDir(v *viper.Viper, configDir string) error { continue } ext := path.Ext(entry.Name()) - if ext != ".yaml" && ext != ".yml" { + if ext != ".yaml" && ext != ".yml" && ext != ".json" { continue } @@ -33,22 +34,15 @@ func ReadConfigDir(v *viper.Viper, configDir string) error { } // mergeConfig reads config file and merge its content with current viper. -func mergeConfig(v *viper.Viper, fileName string) (err error) { - var cfgFile *os.File - cfgFile, err = os.Open(fileName) +func mergeConfig(v *viper.Viper, fileName string) error { + cv := viper.New() + cv.SetConfigFile(fileName) + err := cv.ReadInConfig() if err != nil { - return err + return fmt.Errorf("failed to read config: %w", err) } - - defer func() { - errClose := cfgFile.Close() - if err == nil { - err = errClose - } - }() - - if err = v.MergeConfig(cfgFile); err != nil { - return err + if err = v.MergeConfigMap(cv.AllSettings()); err != nil { + return fmt.Errorf("failed to merge config: %w", err) } return nil