// NewEtcdConfig creates a new service discovery backend for etcd func NewEtcdConfig(config map[string]interface{}) Etcd { etcd := Etcd{ Prefix: "/containerbuddy", } etcdConfig := client.Config{} switch endpoints := config["endpoints"].(type) { case string: etcdConfig.Endpoints = []string{endpoints} case []string: etcdConfig.Endpoints = endpoints default: log.Fatal("Must provide etcd endpoints") } prefix, ok := config["prefix"].(string) if ok { etcd.Prefix = prefix } etcdClient, err := client.New(etcdConfig) if err != nil { log.Fatal(err) } etcd.Client = etcdClient etcd.API = client.NewKeysAPI(etcdClient) return etcd }
// SetTLS sets the tls configuration given a tls.Config scheme func setTLS(cfg *etcd.Config, tls *tls.Config, addrs []string) { entries := store.CreateEndpoints(addrs, "https") cfg.Endpoints = entries // Set transport t := http.Transport{ Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: tls, } cfg.Transport = &t }
// NewEtcdConfig creates a new service discovery backend for etcd func NewEtcdConfig(raw interface{}) (*Etcd, error) { etcd := &Etcd{ Prefix: "/containerpilot", } var config etcdRawConfig etcdConfig := client.Config{} if err := utils.DecodeRaw(raw, &config); err != nil { return nil, err } etcdConfig.Endpoints = parseEndpoints(config.Endpoints) if config.Prefix != "" { etcd.Prefix = config.Prefix } etcdClient, err := client.New(etcdConfig) if err != nil { return nil, err } etcd.Client = etcdClient etcd.API = client.NewKeysAPI(etcdClient) return etcd, nil }
func NewRegistry(opts ...registry.Option) registry.Registry { config := etcd.Config{ Endpoints: []string{"http://127.0.0.1:2379"}, } var options registry.Options for _, o := range opts { o(&options) } if options.Timeout == 0 { options.Timeout = etcd.DefaultRequestTimeout } if options.Secure || options.TLSConfig != nil { tlsConfig := options.TLSConfig if tlsConfig == nil { tlsConfig = &tls.Config{ InsecureSkipVerify: true, } } // for InsecureSkipVerify t := &http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: tlsConfig, } runtime.SetFinalizer(&t, func(tr **http.Transport) { (*tr).CloseIdleConnections() }) config.Transport = t // default secure address config.Endpoints = []string{"https://127.0.0.1:2379"} } var cAddrs []string for _, addr := range options.Addrs { if len(addr) == 0 { continue } if options.Secure { // replace http:// with https:// if its there addr = strings.Replace(addr, "http://", "https://", 1) // has the prefix? no... ok add it if !strings.HasPrefix(addr, "https://") { addr = "https://" + addr } } cAddrs = append(cAddrs, addr) } // if we got addrs then we'll update if len(cAddrs) > 0 { config.Endpoints = cAddrs } c, _ := etcd.New(config) e := &etcdRegistry{ client: etcd.NewKeysAPI(c), options: options, } return e }