You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by me...@apache.org on 2021/01/18 12:30:08 UTC

[apisix-dashboard] branch master updated: feat: implement a way to set etcd client (#1323)

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