diff options
author | Wolfy-J <[email protected]> | 2019-12-23 16:19:39 +0300 |
---|---|---|
committer | Wolfy-J <[email protected]> | 2019-12-23 16:19:39 +0300 |
commit | 23e3ca71347aec2152b17def2bb37d4927a6aebe (patch) | |
tree | 645dc399aec15b414dc40d3942c43b095633e7c6 /cmd | |
parent | a11a3a5511a7b986f06c5921932e3438a0a543d7 (diff) |
- the ability to specify config via JSON string
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/rr/cmd/root.go | 4 | ||||
-rw-r--r-- | cmd/util/config.go | 23 |
2 files changed, 23 insertions, 4 deletions
diff --git a/cmd/rr/cmd/root.go b/cmd/rr/cmd/root.go index d6929473..515e6419 100644 --- a/cmd/rr/cmd/root.go +++ b/cmd/rr/cmd/root.go @@ -33,6 +33,7 @@ import ( var ( cfgFile, workDir, logFormat string override []string + mergeJson string // Verbose enables verbosity mode (container specific). Verbose bool @@ -73,6 +74,7 @@ func init() { CLI.PersistentFlags().StringVarP(&logFormat, "logFormat", "l", "color", "select log formatter (color, json, plain)") CLI.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file (default is .rr.yaml)") CLI.PersistentFlags().StringVarP(&workDir, "workDir", "w", "", "work directory") + CLI.PersistentFlags().StringVarP(&mergeJson, "jsonConfig", "j", "", "merge json configuration") CLI.PersistentFlags().StringArrayVarP( &override, @@ -89,7 +91,7 @@ func init() { configureLogger(logFormat) - cfg, err := util.LoadConfig(cfgFile, []string{"."}, ".rr", override) + cfg, err := util.LoadConfig(cfgFile, []string{"."}, ".rr", override, mergeJson) if err != nil { Logger.Warnf("config: %s", err) return diff --git a/cmd/util/config.go b/cmd/util/config.go index 0a8d6005..08e01a89 100644 --- a/cmd/util/config.go +++ b/cmd/util/config.go @@ -1,6 +1,7 @@ package util import ( + "bytes" "fmt" "github.com/spf13/viper" "github.com/spiral/roadrunner/service" @@ -30,7 +31,7 @@ func (w *ConfigWrapper) Unmarshal(out interface{}) error { } // LoadConfig config and merge it's values with set of flags. -func LoadConfig(cfgFile string, path []string, name string, flags []string) (*ConfigWrapper, error) { +func LoadConfig(cfgFile string, path []string, name string, flags []string, jsonConfig string) (*ConfigWrapper, error) { cfg := viper.New() if cfgFile != "" { @@ -68,14 +69,13 @@ func LoadConfig(cfgFile string, path []string, name string, flags []string) (*Co // If a cfg file is found, read it in. if err := cfg.ReadInConfig(); err != nil { - if len(flags) == 0 { + if len(flags) == 0 && jsonConfig == "" { return nil, err } } // merge included configs if include, ok := cfg.Get("include").([]interface{}); ok { - for _, file := range include { filename, ok := file.(string) if !ok { @@ -117,6 +117,23 @@ func LoadConfig(cfgFile string, path []string, name string, flags []string) (*Co } } + if jsonConfig != "" { + jConfig := viper.New() + jConfig.AutomaticEnv() + jConfig.SetEnvPrefix("rr") + jConfig.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + + jConfig.SetConfigType("json") + if err := jConfig.ReadConfig(bytes.NewBufferString(jsonConfig)); err != nil { + return nil, err + } + + // merging + if err := cfg.MergeConfigMap(jConfig.AllSettings()); err != nil { + return nil, err + } + } + merged := viper.New() // we have to copy all the merged values into new config in order normalize it (viper bug?) |