mirror of
https://github.com/spf13/viper
synced 2024-12-23 12:07:02 +00:00
ReadBufConfig
This commit is contained in:
parent
2e47d9ed4a
commit
9f725cec5c
2 changed files with 89 additions and 0 deletions
75
viper.go
75
viper.go
|
@ -36,6 +36,8 @@ import (
|
|||
jww "github.com/spf13/jwalterweatherman"
|
||||
"github.com/spf13/pflag"
|
||||
crypt "github.com/xordataexchange/crypt/config"
|
||||
|
||||
// log "github.com/oliveagle/seelog"
|
||||
)
|
||||
|
||||
var v *Viper
|
||||
|
@ -268,6 +270,8 @@ func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error {
|
|||
v.remoteProviders = append(v.remoteProviders, rp)
|
||||
}
|
||||
}
|
||||
|
||||
// log.Info("remoteProviders", v.remoteProviders)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -716,6 +720,13 @@ func (v *Viper) ReadInConfig() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func ReadBufConfig(buf *bytes.Buffer) error { return v.ReadBufConfig(buf) }
|
||||
func (v *Viper) ReadBufConfig(buf *bytes.Buffer) error {
|
||||
v.config = make(map[string]interface{})
|
||||
v.marshalReader(buf, v.config)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Attempts to get configuration from a remote source
|
||||
// and read it in the remote configuration registry.
|
||||
func ReadRemoteConfig() error { return v.ReadRemoteConfig() }
|
||||
|
@ -727,6 +738,15 @@ func (v *Viper) ReadRemoteConfig() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func WatchRemoteConfig() error { return v.WatchRemoteConfig() }
|
||||
func (v *Viper) WatchRemoteConfig() error {
|
||||
err := v.watchKeyValueConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Marshall a Reader into a map
|
||||
// Should probably be an unexported function
|
||||
func marshalReader(in io.Reader, c map[string]interface{}) { v.marshalReader(in, c) }
|
||||
|
@ -788,6 +808,61 @@ func (v *Viper) getRemoteConfig(provider *remoteProvider) (map[string]interface{
|
|||
return v.kvstore, err
|
||||
}
|
||||
|
||||
// retrieve the first found remote configuration
|
||||
func (v *Viper) watchKeyValueConfig() error {
|
||||
// log.Info("ahahahah==========================================")
|
||||
// log.Info("remoteProviders", v.remoteProviders)
|
||||
|
||||
for _, rp := range v.remoteProviders {
|
||||
val, err := v.watchRemoteConfig(rp)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
v.kvstore = val
|
||||
return nil
|
||||
}
|
||||
return RemoteConfigError("No Files Found")
|
||||
}
|
||||
|
||||
func (v *Viper) watchRemoteConfig(provider *remoteProvider) (map[string]interface{}, error) {
|
||||
// defer log.Flush()
|
||||
// log.Info("ahahahah==========================================")
|
||||
var cm crypt.ConfigManager
|
||||
var err error
|
||||
|
||||
if provider.secretKeyring != "" {
|
||||
kr, err := os.Open(provider.secretKeyring)
|
||||
defer kr.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if provider.provider == "etcd" {
|
||||
cm, err = crypt.NewEtcdConfigManager([]string{provider.endpoint}, kr)
|
||||
} else {
|
||||
cm, err = crypt.NewConsulConfigManager([]string{provider.endpoint}, kr)
|
||||
}
|
||||
} else {
|
||||
if provider.provider == "etcd" {
|
||||
cm, err = crypt.NewStandardEtcdConfigManager([]string{provider.endpoint})
|
||||
} else {
|
||||
cm, err = crypt.NewStandardConsulConfigManager([]string{provider.endpoint})
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp := <-cm.Watch(provider.path, nil)
|
||||
// b, err := cm.Watch(provider.path, nil)
|
||||
err = resp.Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
reader := bytes.NewReader(resp.Value)
|
||||
v.marshalReader(reader, v.kvstore)
|
||||
return v.kvstore, err
|
||||
}
|
||||
|
||||
// Return all keys regardless where they are set
|
||||
func AllKeys() []string { return v.AllKeys() }
|
||||
func (v *Viper) AllKeys() []string {
|
||||
|
|
|
@ -537,3 +537,17 @@ func TestFindsNestedKeys(t *testing.T) {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
func TestReadBufConfig(t *testing.T) {
|
||||
v := New()
|
||||
v.SetConfigType("yaml")
|
||||
v.ReadBufConfig(bytes.NewBuffer(yamlExample))
|
||||
t.Log(v.AllKeys())
|
||||
|
||||
assert.True(t, v.InConfig("name"))
|
||||
assert.False(t, v.InConfig("state"))
|
||||
assert.Equal(t, "steve", v.Get("name"))
|
||||
assert.Equal(t, []interface{}{"skateboarding", "snowboarding", "go"}, v.Get("hobbies"))
|
||||
assert.Equal(t, map[interface{}]interface{}{"jacket": "leather", "trousers": "denim"}, v.Get("clothing"))
|
||||
assert.Equal(t, 35, v.Get("age"))
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue