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{}),