/
driver.go
76 lines (61 loc) · 1.38 KB
/
driver.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
71
72
73
74
75
76
package inmemory
import (
"errors"
"fmt"
"time"
"github.com/danielkrainas/csense/context"
"github.com/danielkrainas/csense/storage"
"github.com/danielkrainas/csense/storage/factory"
"github.com/docker/libkv"
"github.com/docker/libkv/store"
"github.com/docker/libkv/store/etcd"
)
type Factory struct{}
func (d *Factory) Create(parameters map[string]interface{}) (storage.Driver, error) {
keyRoot := "csense"
prefix, ok := parameters["root"].(string)
if ok && prefix != "" {
keyRoot = fmt.Sprintf("%s.%s", prefix, keyRoot)
}
addr, ok := parameters["addr"].(string)
if !ok || addr == "" {
return nil, errors.New("invalid or missing host address")
}
kv, err := libkv.NewStore(
store.ETCD,
[]string{addr},
&store.Config{
ConnectionTimeout: 10 * time.Second,
},
)
if err != nil {
return nil, err
}
return &Driver{
kv: kv,
keyRoot: keyRoot,
hooks: &hookStore{keyRoot, kv},
}, nil
}
func init() {
etcd.Register()
factory.Register("etcd", &Factory{})
}
type Driver struct {
kv store.Store
keyRoot string
hooks *hookStore
}
var _ storage.Driver = &Driver{}
func (d *Driver) Init() error {
return nil
}
func (d *Driver) Setup(ctx context.Context) error {
return storage.ErrNotSupported
}
func (d *Driver) Teardown(ctx context.Context) error {
return d.kv.DeleteTree(d.keyRoot)
}
func (d *Driver) Hooks() storage.HookStore {
return d.hooks
}