diff --git a/integrationtest/docker-compose.yml b/integrationtest/docker-compose.yml new file mode 100644 index 0000000..2a397c6 --- /dev/null +++ b/integrationtest/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' + +services: + consul-kv: + image: consul + ports: + - "8500:8500" + + zookeeper-kv: + image: zookeeper + ports: + - "2181:2181" + + etcd-kv: + image: quay.io/coreos/etcd:v3.3.12 + command: etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2380 + ports: + - "2379:2379" diff --git a/integrationtest/loader.go b/integrationtest/loader.go new file mode 100644 index 0000000..e4dd4b8 --- /dev/null +++ b/integrationtest/loader.go @@ -0,0 +1,121 @@ +package main + +import ( + "bytes" + "compress/gzip" + "io/ioutil" + "log" + "time" + + "github.com/abronan/valkeyrie" + "github.com/abronan/valkeyrie/store" + "github.com/abronan/valkeyrie/store/boltdb" + "github.com/abronan/valkeyrie/store/consul" + etcdv3 "github.com/abronan/valkeyrie/store/etcd/v3" + "github.com/abronan/valkeyrie/store/zookeeper" +) + +const storeKey = "traefik/acme/account/object" + +func main() { + log.SetFlags(log.Lshortfile) + + source := "./acme.json" + err := loadData(source) + if err != nil { + log.Fatal(err) + } +} + +func loadData(source string) error { + content, err := readFile(source) + if err != nil { + return err + } + + // Consul + err = putData(store.CONSUL, []string{"localhost:8500"}, content) + if err != nil { + return err + } + + // ETCD v3 + err = putData(store.ETCDV3, []string{"localhost:2379"}, content) + if err != nil { + return err + } + + // Zookeeper + err = putData(store.ZK, []string{"localhost:2181"}, content) + if err != nil { + return err + } + + // BoltDB + err = putData(store.BOLTDB, []string{"/tmp/test-traefik-certs-dumper.db"}, content) + if err != nil { + return err + } + + return nil +} + +func putData(backend store.Backend, addrs []string, content []byte) error { + storeConfig := &store.Config{ + ConnectionTimeout: 3 * time.Second, + Bucket: "traefik", + } + + switch backend { + case store.CONSUL: + consul.Register() + case store.ETCDV3: + etcdv3.Register() + case store.ZK: + zookeeper.Register() + case store.BOLTDB: + boltdb.Register() + } + + kvStore, err := valkeyrie.NewStore(backend, addrs, storeConfig) + if err != nil { + return err + } + + if err := kvStore.Put(storeKey, content, nil); err != nil { + return err + } + + log.Printf("Successfully updated %s.\n", backend) + return nil +} + +func readFile(source string) ([]byte, error) { + content, err := ioutil.ReadFile(source) + if err != nil { + return nil, err + } + + var b bytes.Buffer + gz := gzip.NewWriter(&b) + + defer func() { + if errC := gz.Close(); errC != nil { + log.Println(errC) + } + }() + + if _, err = gz.Write(content); err != nil { + return nil, err + } + + if err = gz.Flush(); err != nil { + return nil, err + } + + if err := gz.Close(); err != nil { + return nil, err + } + + return b.Bytes(), nil +} diff --git a/integrationtest/readme.md b/integrationtest/readme.md new file mode 100644 index 0000000..a1ba456 --- /dev/null +++ b/integrationtest/readme.md @@ -0,0 +1,42 @@ +# Integration testing + +## Preparation + +- Create valid ACME file `./acme.json` + +- Start backends using docker + +```bash +docker-compose -f integrationtest/docker-compose.yml up +``` + +- Initialize backends + +```bash +go run integrationtest/loader.go +``` + +## Run certs dumper without watching + +```bash +# http://localhost:8500/ui/ +traefik-certs-dumper kv consul --endpoints localhost:8500 + +traefik-certs-dumper kv etcd --endpoints localhost:2379 + +traefik-certs-dumper kv boltdb --endpoints /tmp/test-traefik-certs-dumper.db + +traefik-certs-dumper kv zookeeper --endpoints localhost:2181 +``` + +## Run certs dumper with watching + +While watching is enabled, run `loader.go` again for KV backends or manipulate `/tmp/acme.json` for file backend that change events are triggered. + +```bash +traefik-certs-dumper kv consul --watch --endpoints localhost:8500 + +traefik-certs-dumper kv etcd --watch --endpoints localhost:2379 + +traefik-certs-dumper kv zookeeper --watch --endpoints localhost:2181 +```