feat(kv): watch support.

This commit is contained in:
Fernandez Ludovic 2019-04-20 17:57:11 +02:00
parent 48b04a22d2
commit 3ab61bca31
3 changed files with 39 additions and 5 deletions

View File

@ -23,11 +23,12 @@ func init() {
kvCmd.PersistentFlags().String("prefix", "traefik", "Prefix used for KV store.") kvCmd.PersistentFlags().String("prefix", "traefik", "Prefix used for KV store.")
kvCmd.PersistentFlags().String("password", "", "Password for connection.") kvCmd.PersistentFlags().String("password", "", "Password for connection.")
kvCmd.PersistentFlags().String("username", "", "Username for connection.") kvCmd.PersistentFlags().String("username", "", "Username for connection.")
kvCmd.PersistentFlags().Bool("watch", false, "Enable watching changes.")
// FIXME review TLS parts // FIXME review TLS parts
kvCmd.PersistentFlags().Bool("tls.enable", false, "Enable TLS encryption.") // kvCmd.PersistentFlags().Bool("tls.enable", false, "Enable TLS encryption.")
kvCmd.PersistentFlags().Bool("tls.insecureskipverify", false, "Trust unverified certificates if TLS is enabled.") // kvCmd.PersistentFlags().Bool("tls.insecureskipverify", false, "Trust unverified certificates if TLS is enabled.")
kvCmd.PersistentFlags().String("tls.ca-cert-file", "", "Root CA file for certificate verification if TLS is enabled.") // kvCmd.PersistentFlags().String("tls.ca-cert-file", "", "Root CA file for certificate verification if TLS is enabled.")
} }
func getKvConfig(cmd *cobra.Command) (*kv.Config, error) { func getKvConfig(cmd *cobra.Command) (*kv.Config, error) {

View File

@ -7,5 +7,6 @@ type Config struct {
Backend store.Backend Backend store.Backend
Prefix string Prefix string
Endpoints []string Endpoints []string
Watch bool
Options *store.Config Options *store.Config
} }

View File

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"compress/gzip" "compress/gzip"
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"github.com/abronan/valkeyrie" "github.com/abronan/valkeyrie"
@ -11,7 +12,7 @@ import (
"github.com/ldez/traefik-certs-dumper/dumper" "github.com/ldez/traefik-certs-dumper/dumper"
) )
const storeKey = "/acme/account/object" const storeKeySuffix = "/acme/account/object"
// Dump FIXME // Dump FIXME
func Dump(config *Config, baseConfig *dumper.BaseConfig) error { func Dump(config *Config, baseConfig *dumper.BaseConfig) error {
@ -20,11 +21,42 @@ func Dump(config *Config, baseConfig *dumper.BaseConfig) error {
return err return err
} }
pair, err := kvStore.Get(config.Prefix+storeKey, nil) storeKey := config.Prefix + storeKeySuffix
if config.Watch {
return watch(kvStore, storeKey, baseConfig)
}
pair, err := kvStore.Get(storeKey, nil)
if err != nil { if err != nil {
return err return err
} }
return dumpPair(pair, baseConfig)
}
func watch(kvStore store.Store, storeKey string, baseConfig *dumper.BaseConfig) error {
stopCh := make(<-chan struct{})
pairs, err := kvStore.Watch(storeKey, stopCh, nil)
if err != nil {
return err
}
for {
pair := <-pairs
if pair == nil {
return fmt.Errorf("could not fetch Key/Value pair for key %v", storeKey)
}
err = dumpPair(pair, baseConfig)
if err != nil {
return err
}
}
}
func dumpPair(pair *store.KVPair, baseConfig *dumper.BaseConfig) error {
data, err := getStoredDataFromGzip(pair) data, err := getStoredDataFromGzip(pair)
if err != nil { if err != nil {
return err return err