This commit is contained in:
Manfred Touron
2017-05-18 18:54:23 +02:00
parent dc386661ca
commit 5448f25fd6
645 changed files with 55908 additions and 33297 deletions

View File

@@ -1,8 +1,6 @@
package consul
import (
consul "github.com/hashicorp/consul/api"
)
import consul "github.com/hashicorp/consul/api"
// Client is a wrapper around the Consul API.
type Client interface {

View File

@@ -1,13 +1,13 @@
package consul
import (
"context"
"errors"
"io"
"reflect"
"testing"
stdconsul "github.com/hashicorp/consul/api"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
)

View File

@@ -14,9 +14,11 @@ import (
)
func TestIntegration(t *testing.T) {
consulAddr := os.Getenv("CONSUL_ADDR")
// Connect to Consul.
// docker run -p 8500:8500 progrium/consul -server -bootstrap
consulAddr := os.Getenv("CONSUL_ADDRESS")
if consulAddr == "" {
t.Fatal("CONSUL_ADDR is not set")
t.Fatal("CONSUL_ADDRESS is not set")
}
stdClient, err := stdconsul.NewClient(&stdconsul.Config{
Address: consulAddr,
@@ -46,7 +48,7 @@ func TestIntegration(t *testing.T) {
subscriber := NewSubscriber(
client,
factory,
log.With(logger, "component", "subscriber"),
log.NewContext(logger).With("component", "subscriber"),
r.Name,
r.Tags,
true,
@@ -64,7 +66,7 @@ func TestIntegration(t *testing.T) {
}
// Build a registrar for r.
registrar := NewRegistrar(client, r, log.With(logger, "component", "registrar"))
registrar := NewRegistrar(client, r, log.NewContext(logger).With("component", "registrar"))
registrar.Register()
defer registrar.Deregister()

View File

@@ -21,7 +21,7 @@ func NewRegistrar(client Client, r *stdconsul.AgentServiceRegistration, logger l
return &Registrar{
client: client,
registration: r,
logger: log.With(logger, "service", r.Name, "tags", fmt.Sprint(r.Tags), "address", r.Address),
logger: log.NewContext(logger).With("service", r.Name, "tags", fmt.Sprint(r.Tags), "address", r.Address),
}
}

View File

@@ -36,7 +36,7 @@ func NewSubscriber(client Client, factory sd.Factory, logger log.Logger, service
s := &Subscriber{
cache: cache.New(factory, logger),
client: client,
logger: log.With(logger, "service", service, "tags", fmt.Sprint(tags)),
logger: log.NewContext(logger).With("service", service, "tags", fmt.Sprint(tags)),
service: service,
tags: tags,
passingOnly: passingOnly,

View File

@@ -1,10 +1,10 @@
package consul
import (
"context"
"testing"
consul "github.com/hashicorp/consul/api"
"golang.org/x/net/context"
"github.com/go-kit/kit/log"
)

View File

@@ -1,7 +1,6 @@
package etcd
import (
"context"
"crypto/tls"
"crypto/x509"
"errors"
@@ -11,6 +10,7 @@ import (
"time"
etcd "github.com/coreos/etcd/client"
"golang.org/x/net/context"
)
var (
@@ -156,15 +156,7 @@ func (c *client) Register(s Service) error {
if s.Value == "" {
return ErrNoValue
}
var err error
if s.TTL != nil {
_, err = c.keysAPI.Set(c.ctx, s.Key, s.Value, &etcd.SetOptions{
PrevExist: etcd.PrevIgnore,
TTL: s.TTL.ttl,
})
} else {
_, err = c.keysAPI.Create(c.ctx, s.Key, s.Value)
}
_, err := c.keysAPI.Create(c.ctx, s.Key, s.Value)
return err
}

View File

@@ -6,9 +6,8 @@ import (
"testing"
"time"
"golang.org/x/net/context"
etcd "github.com/coreos/etcd/client"
"golang.org/x/net/context"
)
func TestNewClient(t *testing.T) {

View File

@@ -1,10 +1,11 @@
package etcd
import (
"context"
"io"
"time"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/sd/lb"

View File

@@ -3,12 +3,13 @@
package etcd
import (
"context"
"io"
"os"
"testing"
"time"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/log"
)
@@ -49,7 +50,7 @@ func TestIntegration(t *testing.T) {
registrar := NewRegistrar(client, Service{
Key: key,
Value: value,
}, log.With(log.NewLogfmtLogger(os.Stderr), "component", "registrar"))
}, log.NewContext(log.NewLogfmtLogger(os.Stderr)).With("component", "registrar"))
// Register our instance.
registrar.Register()
@@ -71,7 +72,7 @@ func TestIntegration(t *testing.T) {
client,
prefix,
func(string) (endpoint.Endpoint, io.Closer, error) { return endpoint.Nop, nil, nil },
log.With(log.NewLogfmtLogger(os.Stderr), "component", "subscriber"),
log.NewContext(log.NewLogfmtLogger(os.Stderr)).With("component", "subscriber"),
)
if err != nil {
t.Fatalf("NewSubscriber: %v", err)

View File

@@ -1,24 +1,16 @@
package etcd
import (
"sync"
"time"
etcd "github.com/coreos/etcd/client"
"github.com/go-kit/kit/log"
)
const minHeartBeatTime = 500 * time.Millisecond
// Registrar registers service instance liveness information to etcd.
type Registrar struct {
client Client
service Service
logger log.Logger
quitmtx sync.Mutex
quit chan struct{}
}
// Service holds the instance identifying data you want to publish to etcd. Key
@@ -27,43 +19,19 @@ type Registrar struct {
type Service struct {
Key string // unique key, e.g. "/service/foobar/1.2.3.4:8080"
Value string // returned to subscribers, e.g. "http://1.2.3.4:8080"
TTL *TTLOption
DeleteOptions *etcd.DeleteOptions
}
// TTLOption allow setting a key with a TTL. This option will be used by a loop
// goroutine which regularly refreshes the lease of the key.
type TTLOption struct {
heartbeat time.Duration // e.g. time.Second * 3
ttl time.Duration // e.g. time.Second * 10
}
// NewTTLOption returns a TTLOption that contains proper TTL settings. Heartbeat
// is used to refresh the lease of the key periodically; its value should be at
// least 500ms. TTL defines the lease of the key; its value should be
// significantly greater than heartbeat.
//
// Good default values might be 3s heartbeat, 10s TTL.
func NewTTLOption(heartbeat, ttl time.Duration) *TTLOption {
if heartbeat <= minHeartBeatTime {
heartbeat = minHeartBeatTime
}
if ttl <= heartbeat {
ttl = 3 * heartbeat
}
return &TTLOption{
heartbeat: heartbeat,
ttl: ttl,
}
}
// NewRegistrar returns a etcd Registrar acting on the provided catalog
// registration (service).
func NewRegistrar(client Client, service Service, logger log.Logger) *Registrar {
return &Registrar{
client: client,
service: service,
logger: log.With(logger, "key", service.Key, "value", service.Value),
logger: log.NewContext(logger).With(
"key", service.Key,
"value", service.Value,
),
}
}
@@ -75,31 +43,6 @@ func (r *Registrar) Register() {
} else {
r.logger.Log("action", "register")
}
if r.service.TTL != nil {
go r.loop()
}
}
func (r *Registrar) loop() {
r.quitmtx.Lock()
if r.quit != nil {
return // already running
}
r.quit = make(chan struct{})
r.quitmtx.Unlock()
tick := time.NewTicker(r.service.TTL.heartbeat)
defer tick.Stop()
for {
select {
case <-tick.C:
if err := r.client.Register(r.service); err != nil {
r.logger.Log("err", err)
}
case <-r.quit:
return
}
}
}
// Deregister implements the sd.Registrar interface. Call it when you want your
@@ -110,11 +53,4 @@ func (r *Registrar) Deregister() {
} else {
r.logger.Log("action", "deregister")
}
r.quitmtx.Lock()
defer r.quitmtx.Unlock()
if r.quit != nil {
close(r.quit)
r.quit = nil
}
}

View File

@@ -30,7 +30,7 @@ func (tc *testClient) Deregister(s Service) error {
}
// default service used to build registrar in our tests
var testService = Service{"testKey", "testValue", nil, nil}
var testService = Service{"testKey", "testValue", nil}
// NewRegistar should return a registar with a logger using the service key and value
func TestNewRegistar(t *testing.T) {

View File

@@ -1,12 +1,12 @@
package lb
import (
"context"
"math"
"testing"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/sd"
"golang.org/x/net/context"
)
func TestRandom(t *testing.T) {

View File

@@ -1,11 +1,12 @@
package lb
import (
"context"
"fmt"
"strings"
"time"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
)

View File

@@ -1,11 +1,12 @@
package lb_test
import (
"context"
"errors"
"testing"
"time"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/sd"
"github.com/go-kit/kit/sd/lb"

View File

@@ -1,13 +1,14 @@
package lb
import (
"context"
"reflect"
"sync"
"sync/atomic"
"testing"
"time"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/sd"
)

View File

@@ -4,7 +4,8 @@ package zk
import (
"bytes"
"log"
"flag"
"fmt"
"os"
"testing"
"time"
@@ -17,11 +18,21 @@ var (
)
func TestMain(m *testing.M) {
zkAddr := os.Getenv("ZK_ADDR")
if zkAddr == "" {
log.Fatal("ZK_ADDR is not set")
flag.Parse()
fmt.Println("Starting ZooKeeper server...")
ts, err := stdzk.StartTestCluster(1, nil, nil)
if err != nil {
fmt.Printf("ZooKeeper server error: %v\n", err)
os.Exit(1)
}
host = []string{zkAddr}
host = []string{fmt.Sprintf("localhost:%d", ts.Servers[0].Port)}
code := m.Run()
ts.Stop()
os.Exit(code)
}
func TestCreateParentNodesOnServer(t *testing.T) {

View File

@@ -24,7 +24,7 @@ func NewRegistrar(client Client, service Service, logger log.Logger) *Registrar
return &Registrar{
client: client,
service: service,
logger: log.With(logger,
logger: log.NewContext(logger).With(
"service", service.Name,
"path", service.Path,
"data", string(service.Data),

View File

@@ -1,7 +1,6 @@
package zk
import (
"context"
"errors"
"fmt"
"io"
@@ -9,6 +8,7 @@ import (
"time"
"github.com/samuel/go-zookeeper/zk"
"golang.org/x/net/context"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/log"