2016-08-23 08:31:50 +08:00
// Package config provides functions for reading and parsing the provider credentials json file.
// It cleans nonstandard json features (comments and trailing commas), as well as replaces environment variable placeholders with
// their environment variable equivalents. To reference an environment variable in your json file, simply use values in this format:
// "key"="$ENV_VAR_NAME"
package config
import (
"encoding/json"
"os"
"strings"
"github.com/DisposaBoy/JsonConfigReader"
"github.com/TomOnTime/utfutil"
2018-02-06 05:17:20 +08:00
"github.com/pkg/errors"
2016-08-23 08:31:50 +08:00
)
// LoadProviderConfigs will open the specified file name, and parse its contents. It will replace environment variables it finds if any value matches $[A-Za-z_-0-9]+
func LoadProviderConfigs ( fname string ) ( map [ string ] map [ string ] string , error ) {
var results = map [ string ] map [ string ] string { }
dat , err := utfutil . ReadFile ( fname , utfutil . POSIX )
if err != nil {
2018-01-10 01:53:16 +08:00
// no creds file is ok. Bind requires nothing for example. Individual providers will error if things not found.
2017-03-23 00:38:08 +08:00
if os . IsNotExist ( err ) {
return results , nil
}
2018-02-06 05:17:20 +08:00
return nil , errors . Errorf ( "While reading provider credentials file %v: %v" , fname , err )
2016-08-23 08:31:50 +08:00
}
s := string ( dat )
r := JsonConfigReader . New ( strings . NewReader ( s ) )
err = json . NewDecoder ( r ) . Decode ( & results )
if err != nil {
2018-02-06 05:17:20 +08:00
return nil , errors . Errorf ( "While parsing provider credentials file %v: %v" , fname , err )
2016-08-23 08:31:50 +08:00
}
if err = replaceEnvVars ( results ) ; err != nil {
return nil , err
}
return results , nil
}
func replaceEnvVars ( m map [ string ] map [ string ] string ) error {
2017-03-17 13:42:53 +08:00
for _ , keys := range m {
2016-08-23 08:31:50 +08:00
for k , v := range keys {
if strings . HasPrefix ( v , "$" ) {
env := v [ 1 : ]
newVal := os . Getenv ( env )
keys [ k ] = newVal
}
}
}
return nil
}