Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fallback to env backend #470

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions backends/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/kelseyhightower/confd/backends/stackengine"
"github.com/kelseyhightower/confd/backends/vault"
"github.com/kelseyhightower/confd/backends/zookeeper"
"github.com/kelseyhightower/confd/backends/fallback"
"github.com/kelseyhightower/confd/log"
)

Expand All @@ -30,6 +31,22 @@ func New(config Config) (StoreClient, error) {
}
backendNodes := config.BackendNodes
log.Info("Backend nodes set to " + strings.Join(backendNodes, ", "))
if config.BackendFallback != "" {
mainConfig := config
fallbackConfig := config
mainConfig.BackendFallback = ""
fallbackConfig.Backend = config.BackendFallback
fallbackConfig.BackendFallback = ""
backendMain, err := New(mainConfig)
if err != nil {
return nil, err
}
backendFallback, err := New(fallbackConfig)
if err != nil {
return nil, err
}
return fallback.NewFallbackClient(backendMain, backendFallback)
}
switch config.Backend {
case "consul":
return consul.New(config.BackendNodes, config.Scheme,
Expand Down
1 change: 1 addition & 0 deletions backends/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ type Config struct {
AuthToken string
AuthType string
Backend string
BackendFallback string
BasicAuth bool
ClientCaKeys string
ClientCert string
Expand Down
49 changes: 49 additions & 0 deletions backends/fallback/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package fallback

import (
"fmt"

"github.com/kelseyhightower/confd/log"
)


type StoreClient interface {
GetValues(keys []string) (map[string]string, error)
WatchPrefix(prefix string, keys []string, waitIndex uint64, stopChan chan bool) (uint64, error)
}

// Client provides a shell for the env client
type FallbackClient struct{
mainBackend StoreClient
fallbackBackend StoreClient
}

// NewEnvClient returns a new client
func NewFallbackClient(mainBackend StoreClient, fallbackBackend StoreClient) (*FallbackClient, error) {
return &FallbackClient{mainBackend, fallbackBackend}, nil
}

// GetValues queries the environment for keys
func (c *FallbackClient) GetValues(keys []string) (map[string]string, error) {
fallback_vars, err := c.fallbackBackend.GetValues(keys)
if err != nil {
return nil, err
}

vars, err := c.mainBackend.GetValues(keys)
if err == nil {
log.Info(fmt.Sprintf("Key Map: %#v", vars))
for k, v := range vars {
fallback_vars[k] = v
}
}

log.Info(fmt.Sprintf("Key Map: %#v", fallback_vars))
return fallback_vars, nil
}


func (c *FallbackClient) WatchPrefix(prefix string, keys []string, waitIndex uint64, stopChan chan bool) (uint64, error) {
return c.mainBackend.WatchPrefix(prefix, keys, waitIndex, stopChan)
}

6 changes: 6 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ var (
authToken string
authType string
backend string
backendFallback string
basicAuth bool
clientCaKeys string
clientCert string
Expand Down Expand Up @@ -56,6 +57,7 @@ type Config struct {
AuthToken string `toml:"auth_token"`
AuthType string `toml:"auth_type"`
Backend string `toml:"backend"`
BackendFallback string `toml:"backend_fallback"`
BasicAuth bool `toml:"basic_auth"`
BackendNodes []string `toml:"nodes"`
ClientCaKeys string `toml:"client_cakeys"`
Expand All @@ -81,6 +83,7 @@ type Config struct {
func init() {
flag.StringVar(&authToken, "auth-token", "", "Auth bearer token to use")
flag.StringVar(&backend, "backend", "etcd", "backend to use")
flag.StringVar(&backendFallback, "backend-fallback", "", "backend to fallback to on none existing keys")
flag.BoolVar(&basicAuth, "basic-auth", false, "Use Basic Auth to authenticate (only used with -backend=etcd)")
flag.StringVar(&clientCaKeys, "client-ca-keys", "", "client ca keys")
flag.StringVar(&clientCert, "client-cert", "", "the client cert")
Expand Down Expand Up @@ -208,6 +211,7 @@ func initConfig() error {
AuthToken: config.AuthToken,
AuthType: config.AuthType,
Backend: config.Backend,
BackendFallback: config.BackendFallback,
BasicAuth: config.BasicAuth,
ClientCaKeys: config.ClientCaKeys,
ClientCert: config.ClientCert,
Expand Down Expand Up @@ -280,6 +284,8 @@ func setConfigFromFlag(f *flag.Flag) {
config.AuthType = authType
case "backend":
config.Backend = backend
case "backend-fallback":
config.BackendFallback = backendFallback
case "basic-auth":
config.BasicAuth = basicAuth
case "client-cert":
Expand Down
8 changes: 8 additions & 0 deletions docs/quick-start-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,14 @@ database_url = db.example.com
database_user = rob
```

## Fallback to env

Fallback to env on key that aren't defined in etcd/consul or others backends:

```
confd -onetime -backend consul -backend-fallback env -node 127.0.0.0:8500
```

## Advanced Example

In this example we will use confd to manage two nginx config files using a single template.
Expand Down