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 <[email protected]>
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{}),