forked from blox/blox
/
etcd.go
70 lines (58 loc) · 2.44 KB
/
etcd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package clients
import (
"time"
etcd "github.com/coreos/etcd/clientv3"
"github.com/pkg/errors"
"golang.org/x/net/context"
)
// EtcdInterface defines etcd methods that are used in the project to enable mocking
type EtcdInterface interface {
// Close shuts down the client's etcd connections.
Close() error
// Put puts a key-value pair into etcd.
// Note that key,value can be plain bytes array and string is
// an immutable representation of that bytes array.
// To get a string of bytes, do string([]byte(0x10, 0x20)).
Put(ctx context.Context, key, val string, opts ...etcd.OpOption) (*etcd.PutResponse, error)
// Get retrieves keys.
// By default, Get will return the value for "key", if any.
// When passed WithRange(end), Get will return the keys in the range [key, end).
// When passed WithFromKey(), Get returns keys greater than or equal to key.
// When passed WithRev(rev) with rev > 0, Get retrieves keys at the given revision;
// if the required revision is compacted, the request will fail with ErrCompacted .
// When passed WithLimit(limit), the number of returned keys is bounded by limit.
// When passed WithSort(), the keys will be sorted.
Get(ctx context.Context, key string, opts ...etcd.OpOption) (*etcd.GetResponse, error)
// Delete deletes a key, or optionally using WithRange(end), [key, end).
Delete(ctx context.Context, key string, opts ...etcd.OpOption) (*etcd.DeleteResponse, error)
}
var _ EtcdInterface = (*etcd.Client)(nil)
const (
dialTimeout = 5 * time.Second
)
// NewEtcdClient initializes an etcd client
func NewEtcdClient(endpoints []string) (*etcd.Client, error) {
if len(endpoints) == 0 {
return nil, errors.New("Etcd endpoints should not be empty")
}
etcd, err := etcd.New(etcd.Config{
Endpoints: endpoints,
DialTimeout: dialTimeout,
})
if err != nil {
return nil, errors.Wrap(err, "Etcd connection error")
}
return etcd, nil
}