This is an automated email from the ASF dual-hosted git repository.

membphis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 5aaae95  feat: implement a way to set etcd client (#1323)
5aaae95 is described below

commit 5aaae956803f512982e8ce3e3f386750b9e30b67
Author: Peter Zhu <starsz...@gmail.com>
AuthorDate: Mon Jan 18 20:29:57 2021 +0800

    feat: implement a way to set etcd client (#1323)
---
 api/internal/core/storage/etcd.go     | 48 ++++++++++++++++++++++++++++++-----
 api/internal/core/store/store.go      |  2 +-
 api/internal/core/store/store_test.go |  2 +-
 3 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/api/internal/core/storage/etcd.go 
b/api/internal/core/storage/etcd.go
index fb879b3..4bd3ea8 100644
--- a/api/internal/core/storage/etcd.go
+++ b/api/internal/core/storage/etcd.go
@@ -33,6 +33,7 @@ var (
 )
 
 type EtcdV3Storage struct {
+       client *clientv3.Client
 }
 
 func InitETCDClient(etcdConf *conf.Etcd) error {
@@ -46,11 +47,38 @@ func InitETCDClient(etcdConf *conf.Etcd) error {
                log.Errorf("init etcd failed: %s", err)
                return fmt.Errorf("init etcd failed: %s", err)
        }
+
        Client = cli
        utils.AppendToClosers(Close)
        return nil
 }
 
+func GenEtcdStorage() *EtcdV3Storage {
+       return &EtcdV3Storage{
+               client: Client,
+       }
+}
+
+func NewETCDStorage(etcdConf *conf.Etcd) (*EtcdV3Storage, error) {
+       cli, err := clientv3.New(clientv3.Config{
+               Endpoints:   etcdConf.Endpoints,
+               DialTimeout: 5 * time.Second,
+               Username:    etcdConf.Username,
+               Password:    etcdConf.Password,
+       })
+       if err != nil {
+               log.Errorf("init etcd failed: %s", err)
+               return nil, fmt.Errorf("init etcd failed: %s", err)
+       }
+
+       s := &EtcdV3Storage{
+               client: cli,
+       }
+
+       utils.AppendToClosers(s.Close)
+       return s, nil
+}
+
 func Close() error {
        if err := Client.Close(); err != nil {
                log.Errorf("etcd client close failed: %s", err)
@@ -59,8 +87,16 @@ func Close() error {
        return nil
 }
 
+func (s *EtcdV3Storage) Close() error {
+       if err := s.client.Close(); err != nil {
+               log.Errorf("etcd client close failed: %s", err)
+               return err
+       }
+       return nil
+}
+
 func (s *EtcdV3Storage) Get(ctx context.Context, key string) (string, error) {
-       resp, err := Client.Get(ctx, key)
+       resp, err := s.client.Get(ctx, key)
        if err != nil {
                log.Errorf("etcd get failed: %s", err)
                return "", fmt.Errorf("etcd get failed: %s", err)
@@ -74,7 +110,7 @@ func (s *EtcdV3Storage) Get(ctx context.Context, key string) 
(string, error) {
 }
 
 func (s *EtcdV3Storage) List(ctx context.Context, key string) ([]Keypair, 
error) {
-       resp, err := Client.Get(ctx, key, clientv3.WithPrefix())
+       resp, err := s.client.Get(ctx, key, clientv3.WithPrefix())
        if err != nil {
                log.Errorf("etcd get failed: %s", err)
                return nil, fmt.Errorf("etcd get failed: %s", err)
@@ -92,7 +128,7 @@ func (s *EtcdV3Storage) List(ctx context.Context, key 
string) ([]Keypair, error)
 }
 
 func (s *EtcdV3Storage) Create(ctx context.Context, key, val string) error {
-       _, err := Client.Put(ctx, key, val)
+       _, err := s.client.Put(ctx, key, val)
        if err != nil {
                log.Errorf("etcd put failed: %s", err)
                return fmt.Errorf("etcd put failed: %s", err)
@@ -101,7 +137,7 @@ func (s *EtcdV3Storage) Create(ctx context.Context, key, 
val string) error {
 }
 
 func (s *EtcdV3Storage) Update(ctx context.Context, key, val string) error {
-       _, err := Client.Put(ctx, key, val)
+       _, err := s.client.Put(ctx, key, val)
        if err != nil {
                log.Errorf("etcd put failed: %s", err)
                return fmt.Errorf("etcd put failed: %s", err)
@@ -111,7 +147,7 @@ func (s *EtcdV3Storage) Update(ctx context.Context, key, 
val string) error {
 
 func (s *EtcdV3Storage) BatchDelete(ctx context.Context, keys []string) error {
        for i := range keys {
-               resp, err := Client.Delete(ctx, keys[i])
+               resp, err := s.client.Delete(ctx, keys[i])
                if err != nil {
                        log.Errorf("delete etcd key[%s] failed: %s", keys[i], 
err)
                        return fmt.Errorf("delete etcd key[%s] failed: %s", 
keys[i], err)
@@ -125,7 +161,7 @@ func (s *EtcdV3Storage) BatchDelete(ctx context.Context, 
keys []string) error {
 }
 
 func (s *EtcdV3Storage) Watch(ctx context.Context, key string) <-chan 
WatchResponse {
-       eventChan := Client.Watch(ctx, key, clientv3.WithPrefix())
+       eventChan := s.client.Watch(ctx, key, clientv3.WithPrefix())
        ch := make(chan WatchResponse, 1)
        go func() {
                for event := range eventChan {
diff --git a/api/internal/core/store/store.go b/api/internal/core/store/store.go
index 794375b..7af266c 100644
--- a/api/internal/core/store/store.go
+++ b/api/internal/core/store/store.go
@@ -83,7 +83,7 @@ func NewGenericStore(opt GenericStoreOption) (*GenericStore, 
error) {
        s := &GenericStore{
                opt: opt,
        }
-       s.Stg = &storage.EtcdV3Storage{}
+       s.Stg = storage.GenEtcdStorage()
 
        return s, nil
 }
diff --git a/api/internal/core/store/store_test.go 
b/api/internal/core/store/store_test.go
index 8763a4d..f8ed342 100644
--- a/api/internal/core/store/store_test.go
+++ b/api/internal/core/store/store_test.go
@@ -49,7 +49,7 @@ func TestNewGenericStore(t *testing.T) {
                                KeyFunc:  dfFunc,
                        },
                        wantStore: &GenericStore{
-                               Stg: &storage.EtcdV3Storage{},
+                               Stg: storage.GenEtcdStorage(),
                                opt: GenericStoreOption{
                                        BasePath: "test",
                                        ObjType:  
reflect.TypeOf(GenericStoreOption{}),

Reply via email to