diff --git a/common/types/types.go b/common/types/types.go index f8fd7748..b613f60e 100644 --- a/common/types/types.go +++ b/common/types/types.go @@ -113,7 +113,7 @@ type LdapConfiguration struct { // StoreURL: URL of the key-value store // type KVStoreConfig struct { - StoreURL string `json:"kvstore-url"` + StoreURL []string `json:"kvstore-url"` StoreDriver string `json:"kvstore-driver"` } diff --git a/common/utils.go b/common/utils.go index 6cae4bc4..6f8560ca 100644 --- a/common/utils.go +++ b/common/utils.go @@ -172,3 +172,15 @@ func GetNetmasterVersion(address string) (string, error) { return nvr.Version, nil } + + +// FilterEmpty filters empty string from string slices +func FilterEmpty(stringSlice []string) []string { + var result []string + for _, str := range stringSlice { + if str != "" { + result = append(result, str) + } + } + return result +} diff --git a/main.go b/main.go index 2ef9107b..313a2dcc 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,7 @@ import ( "os" "runtime" "syscall" - + "strings" "github.com/blang/semver" "github.com/contiv/auth_proxy/auth" "github.com/contiv/auth_proxy/common" @@ -14,6 +14,7 @@ import ( "github.com/contiv/auth_proxy/state" log "github.com/Sirupsen/logrus" + "net/url" ) const ( @@ -218,8 +219,20 @@ func main() { log.SetLevel(log.DebugLevel) } + storeURL := []string{} + for _, endpoint := range common.FilterEmpty(strings.Split(dataStoreAddress, ",")) { + _, err := url.Parse(endpoint) + if err != nil { + log.Println("invalid %s endpoint: %v", dataStoreAddress, endpoint) + return + } + storeURL = append(storeURL,endpoint) + log.Println("Using state db endpoints: %v", storeURL) + + } + // Initialize data store - if err := state.InitializeStateDriver(dataStoreDriver, dataStoreAddress); err != nil { + if err := state.InitializeStateDriver(dataStoreDriver, storeURL); err != nil { log.Fatalln(err) return } diff --git a/state/consulstatedriver.go b/state/consulstatedriver.go index 2da8b972..bc931425 100644 --- a/state/consulstatedriver.go +++ b/state/consulstatedriver.go @@ -39,21 +39,27 @@ func (d *ConsulStateDriver) Init(config *types.KVStoreConfig) error { var err error var endpoint *url.URL - if config == nil { - return errors.New("Invalid consul config") + if config == nil || len(config.StoreURL) == 0 { + return errors.New("no etcd config found") } - endpoint, err = url.Parse(config.StoreURL) - if err != nil { - return err - } - if endpoint.Scheme == "consul" { - endpoint.Scheme = "http" - } else if endpoint.Scheme != "http" && endpoint.Scheme != "https" { - return fmt.Errorf("invalid consul URL scheme %q", endpoint.Scheme) + for _,dburl := range config.StoreURL { + + endpoint, err = url.Parse(dburl) + if err != nil { + return err + } + + if endpoint.Scheme == "etcd" { + endpoint.Scheme = "http" + } else if endpoint.Scheme != "http" && endpoint.Scheme != "https" { + return fmt.Errorf("invalid etcd URL scheme %q", endpoint.Scheme) + } + } + cfg := api.Config{ - Address: endpoint.Host, + Address: config.StoreURL[0], } // create a consul client diff --git a/state/driverfactory.go b/state/driverfactory.go index d95c9c24..f0f47e1d 100644 --- a/state/driverfactory.go +++ b/state/driverfactory.go @@ -98,11 +98,11 @@ func GetStateDriver() (types.StateDriver, error) { // dataStoreAddress: address of the data store // return values: // returns any error as NewStateDriver() + validation errors -func InitializeStateDriver(dataStoreDriver, dataStoreAddress string) error { +func InitializeStateDriver(dataStoreDriver string, dataStoreAddress []string) error { if dataStoreDriver != EtcdName && dataStoreDriver != ConsulName { return errors.New("Invalid data store driver, please set --data-store-driver (options: [etcd, consul])") } - if common.IsEmpty(dataStoreAddress) { + if len(dataStoreAddress) == 0 { return errors.New("Empty data store address, please set --data-store-address") } _, err := NewStateDriver(dataStoreDriver, &types.KVStoreConfig{StoreURL: dataStoreAddress}) diff --git a/state/etcdstatedriver.go b/state/etcdstatedriver.go index bacd06fc..92b131bb 100644 --- a/state/etcdstatedriver.go +++ b/state/etcdstatedriver.go @@ -51,22 +51,27 @@ func (d *EtcdStateDriver) Init(config *types.KVStoreConfig) error { var err error var endpoint *url.URL - if config == nil { - return errors.New("Invalid etcd config") + if config == nil || len(config.StoreURL) == 0 { + return errors.New("no etcd config found") } - endpoint, err = url.Parse(config.StoreURL) - if err != nil { - return err - } - if endpoint.Scheme == "etcd" { - endpoint.Scheme = "http" - } else if endpoint.Scheme != "http" && endpoint.Scheme != "https" { - return fmt.Errorf("invalid etcd URL scheme %q", endpoint.Scheme) + for _,dburl := range config.StoreURL { + + endpoint, err = url.Parse(dburl) + if err != nil { + return err + } + + if endpoint.Scheme == "etcd" { + endpoint.Scheme = "http" + } else if endpoint.Scheme != "http" && endpoint.Scheme != "https" { + return fmt.Errorf("invalid etcd URL scheme %q", endpoint.Scheme) + } + } etcdConfig := client.Config{ - Endpoints: []string{endpoint.String()}, + Endpoints: config.StoreURL, } // create etcd client