node: Read config files from dir even if config file not set via --config #245

Merged
fyrchik merged 3 commits from acid-ant/frostfs-node:bugfix/238-fix-read-cfg-from-dir into master 2023-04-14 10:19:11 +00:00
3 changed files with 34 additions and 15 deletions
Showing only changes of commit 13dd4ec563 - Show all commits

View file

@ -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

View file

@ -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")))
}

View file

@ -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" {
Review

Reverted, added support for json.

Reverted, added support for json.
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