adding preliminary etcd support
diff --git a/viper.go b/viper.go
index 8f2b60a..f0790b9 100644
--- a/viper.go
+++ b/viper.go
@@ -38,6 +38,7 @@
"github.com/spf13/cast"
jww "github.com/spf13/jwalterweatherman"
"github.com/spf13/pflag"
+ crypt "github.com/xordataexchange/crypt/config"
"gopkg.in/yaml.v1"
)
@@ -459,34 +460,37 @@
return err
}
- getKeyValueConfig()
+ err = getKeyValueConfig()
+ if err != nil {
+ return err
+ }
- MarshallReader(bytes.NewReader(file))
+ MarshallReader(bytes.NewReader(file), config)
return nil
}
-func MarshallReader(in io.Reader) {
+func MarshallReader(in io.Reader, c map[string]interface{}) {
buf := new(bytes.Buffer)
buf.ReadFrom(in)
switch getConfigType() {
case "yaml", "yml":
- if err := yaml.Unmarshal(buf.Bytes(), &config); err != nil {
+ if err := yaml.Unmarshal(buf.Bytes(), &c); err != nil {
jww.ERROR.Fatalf("Error parsing config: %s", err)
}
case "json":
- if err := json.Unmarshal(buf.Bytes(), &config); err != nil {
+ if err := json.Unmarshal(buf.Bytes(), &c); err != nil {
jww.ERROR.Fatalf("Error parsing config: %s", err)
}
case "toml":
- if _, err := toml.Decode(buf.String(), &config); err != nil {
+ if _, err := toml.Decode(buf.String(), &c); err != nil {
jww.ERROR.Fatalf("Error parsing config: %s", err)
}
}
- insensativiseMap(config)
+ insensativiseMap(c)
}
func insensativiseMaps() {
@@ -497,20 +501,23 @@
}
// retrieve the first found remote configuration
-func getKeyValueConfig() {
+func getKeyValueConfig() error {
+ var err error
for _, rp := range remoteProviders {
val, err := getRemoteConfig(rp)
if err != nil {
- kvstore = val
- return
+ continue
}
+ kvstore = val
+ return nil
}
+ return err
}
func getRemoteConfig(provider *remoteProvider) (map[string]interface{}, error) {
switch provider.provider {
case "etcd":
- // do something
+ return getEtcdConfig(provider)
case "consul":
// do something
@@ -518,6 +525,32 @@
return config, nil
}
+func getEtcdConfig(provider *remoteProvider) (map[string]interface{}, error) {
+ 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
+ }
+ cm, err = crypt.NewEtcdConfigManager([]string{provider.endpoint}, kr)
+ } else {
+ cm, err = crypt.NewStandardEtcdConfigManager([]string{provider.endpoint})
+ }
+ if err != nil {
+ return nil, err
+ }
+ b, err := cm.Get(configFile)
+ if err != nil {
+ return nil, err
+ }
+ reader := bytes.NewReader(b)
+ MarshallReader(reader, kvstore)
+ return nil, err
+}
+
func insensativiseMap(m map[string]interface{}) {
for key, val := range m {
lower := strings.ToLower(key)