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("password", "", "Password for connection.")
kvCmd.PersistentFlags().String("username", "", "Username for connection.")
kvCmd.PersistentFlags().Bool("watch", false, "Enable watching changes.")
// FIXME review TLS parts
kvCmd.PersistentFlags().Bool("tls.enable", false, "Enable TLS encryption.")
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().Bool("tls.enable", false, "Enable TLS encryption.")
// 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.")
}
func getKvConfig(cmd *cobra.Command) (*kv.Config, error) {

View File

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

View File

@ -4,6 +4,7 @@ import (
"bytes"
"compress/gzip"
"encoding/json"
"fmt"
"io/ioutil"
"github.com/abronan/valkeyrie"
@ -11,7 +12,7 @@ import (
"github.com/ldez/traefik-certs-dumper/dumper"
)
const storeKey = "/acme/account/object"
const storeKeySuffix = "/acme/account/object"
// Dump FIXME
func Dump(config *Config, baseConfig *dumper.BaseConfig) error {
@ -20,11 +21,42 @@ func Dump(config *Config, baseConfig *dumper.BaseConfig) error {
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 {
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)
if err != nil {
return err