diff --git a/framework/etcd/etcdutil.go b/framework/etcd/etcdutil.go new file mode 100644 index 0000000..e2e07b5 --- /dev/null +++ b/framework/etcd/etcdutil.go @@ -0,0 +1,67 @@ +package etcdutil + +import ( + "github.com/coreos/etcd/clientv3" + "time" + "context" +) +//etcd util only support go1.9+ !!! +type EtcdClient struct { + client *clientv3.Client +} + +func NewEtcdClient(dialTimeout time.Duration, endPoints ...string) (*EtcdClient, error) { + etcdClient := new(EtcdClient) + + if endPoints == nil { + endPoints = make([]string, 0) + endPoints = append(endPoints, "127.0.0.1:2379") + } + + cli, err := clientv3.New(clientv3.Config{ + Endpoints: endPoints, + DialTimeout: dialTimeout, + }) + + if err != nil { + return nil, err + } + etcdClient.client = cli + return etcdClient, nil +} + +func (e *EtcdClient) SimpleGet(key string) (string, error) { + getResp, err := e.client.Get(context.TODO(), key) + if err != nil { + return "", err + } + return string(getResp.Kvs[0].Value), nil +} + +func (e *EtcdClient) SimplePut(key, value string) error { + _, err := e.client.Put(context.TODO(), key, value) + return err +} + +func (e *EtcdClient) SimpleDelete(key string) (int64, error) { + delResp, err := e.client.Delete(context.TODO(), key) + return delResp.Deleted, err +} + +func (e *EtcdClient) SimpleWatch(key string) clientv3.WatchChan { + return e.client.Watch(context.Background(), key) +} + +// etcd v3 not has directory construct, +// by watch a prefix of key to implement watch a directorys in v2 +func (e *EtcdClient) PrefixWatch(prefix string) clientv3.WatchChan { + return e.client.Watch(context.Background(), prefix) +} + +func (e *EtcdClient) Close() error { + err := e.client.Close() + if err != nil { + return err + } + return nil +} diff --git a/framework/etcd/etcdutil_test.go b/framework/etcd/etcdutil_test.go new file mode 100644 index 0000000..1cdac7e --- /dev/null +++ b/framework/etcd/etcdutil_test.go @@ -0,0 +1,38 @@ +package etcdutil + +import ( + "testing" + "fmt" + "os" + "time" +) + +var cli *EtcdClient + +var err error + +func init() { + cli, err = NewEtcdClient(10*time.Second) + if err != nil { + fmt.Println(err.Error()) + os.Exit(2) + } +} + +func TestEtcdPut(t *testing.T) { + defer cli.Close() + putErr := cli.SimplePut("foo", "bar") + if putErr != nil { + fmt.Println(putErr) + return + } + fmt.Println("success") +} + +func TestEtcdGet(t *testing.T) { + val, getErr := cli.SimpleGet("foo") + if getErr != nil { + fmt.Println(getErr) + } + fmt.Println(val) +}