2017-04-17 12:50:02 +02:00
package etcd
import (
"fmt"
2018-01-24 17:52:03 +01:00
"github.com/abronan/valkeyrie/store"
"github.com/abronan/valkeyrie/store/etcd/v2"
"github.com/abronan/valkeyrie/store/etcd/v3"
2017-11-17 17:22:03 +01:00
"github.com/containous/traefik/log"
2017-04-17 12:50:02 +02:00
"github.com/containous/traefik/provider"
"github.com/containous/traefik/provider/kv"
"github.com/containous/traefik/safe"
"github.com/containous/traefik/types"
)
var _ provider . Provider = ( * Provider ) ( nil )
// Provider holds configurations of the provider.
type Provider struct {
2017-10-02 10:32:02 +02:00
kv . Provider ` mapstructure:",squash" export:"true" `
2017-11-17 17:22:03 +01:00
UseAPIV3 bool ` description:"Use ETCD API V3" export:"true" `
2017-04-17 12:50:02 +02:00
}
2018-07-11 09:08:03 +02:00
// Init the provider
func ( p * Provider ) Init ( constraints types . Constraints ) error {
err := p . Provider . Init ( constraints )
if err != nil {
return err
}
2017-04-17 12:50:02 +02:00
store , err := p . CreateStore ( )
if err != nil {
2018-01-24 17:52:03 +01:00
return fmt . Errorf ( "failed to Connect to KV store: %v" , err )
2017-04-17 12:50:02 +02:00
}
2018-07-11 09:08:03 +02:00
2017-05-11 19:09:06 +02:00
p . SetKVClient ( store )
2018-07-11 09:08:03 +02:00
return nil
}
// Provide allows the etcd provider to Provide configurations to traefik
// using the given configuration channel.
func ( p * Provider ) Provide ( configurationChan chan <- types . ConfigMessage , pool * safe . Pool ) error {
return p . Provider . Provide ( configurationChan , pool )
2017-04-17 12:50:02 +02:00
}
// CreateStore creates the KV store
func ( p * Provider ) CreateStore ( ) ( store . Store , error ) {
2017-11-17 17:22:03 +01:00
if p . UseAPIV3 {
etcdv3 . Register ( )
p . SetStoreType ( store . ETCDV3 )
} else {
// TODO: Deprecated
log . Warn ( "The ETCD API V2 is deprecated. Please use API V3 instead" )
etcd . Register ( )
p . SetStoreType ( store . ETCD )
}
2017-04-17 12:50:02 +02:00
return p . Provider . CreateStore ( )
}