1 // SPDX-License-Identifier: Apache-2.0
\r
2 // Copyright (c) 2020 Intel Corporation
\r
12 pkgerrors "github.com/pkg/errors"
\r
13 "go.etcd.io/etcd/clientv3"
\r
16 // EtcdConfig Configuration values needed for Etcd Client
\r
17 type EtcdConfig struct {
\r
24 // EtcdClient for Etcd
\r
25 type EtcdClient struct {
\r
26 cli *clientv3.Client
\r
30 // Etcd For Mocking purposes
\r
31 type Etcd interface {
\r
32 Put(ctx context.Context, key, val string, opts ...clientv3.OpOption) (*clientv3.PutResponse, error)
\r
33 Get(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetResponse, error)
\r
34 Delete(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.DeleteResponse, error)
\r
37 var getEtcd = func(e *EtcdClient) Etcd {
\r
41 // NewEtcdClient function initializes Etcd client
\r
42 func NewEtcdClient(store *clientv3.Client, c EtcdConfig) (ContextDb, error) {
\r
45 endpoint = "http://" + c.Endpoint + ":2379"
\r
47 etcdClient := clientv3.Config{
\r
48 Endpoints: []string{endpoint},
\r
49 DialTimeout: 5 * time.Second,
\r
51 if len(os.Getenv("CONTEXTDB_EMCO_USERNAME")) > 0 && len(os.Getenv("CONTEXTDB_EMCO_PASSWORD")) > 0 {
\r
52 etcdClient.Username = os.Getenv("CONTEXTDB_EMCO_USERNAME")
\r
53 etcdClient.Password = os.Getenv("CONTEXTDB_EMCO_PASSWORD")
\r
56 store, err = clientv3.New(etcdClient)
\r
58 return nil, pkgerrors.Errorf("Error creating etcd client: %s", err.Error())
\r
68 // Put values in Etcd DB
\r
69 func (e *EtcdClient) Put(key string, value interface{}) error {
\r
72 return pkgerrors.Errorf("Etcd Client not initialized")
\r
75 return pkgerrors.Errorf("Key is null")
\r
78 return pkgerrors.Errorf("Value is nil")
\r
80 v, err := json.Marshal(value)
\r
82 return pkgerrors.Errorf("Json Marshal error: %s", err.Error())
\r
84 _, err = cli.Put(context.Background(), key, string(v))
\r
86 return pkgerrors.Errorf("Error creating etcd entry: %s", err.Error())
\r
91 // Get values from Etcd DB and decodes from json
\r
92 func (e *EtcdClient) Get(key string, value interface{}) error {
\r
95 return pkgerrors.Errorf("Etcd Client not initialized")
\r
98 return pkgerrors.Errorf("Key is null")
\r
101 return pkgerrors.Errorf("Value is nil")
\r
103 getResp, err := cli.Get(context.Background(), key)
\r
105 return pkgerrors.Errorf("Error getting etcd entry: %s", err.Error())
\r
107 if getResp.Count == 0 {
\r
108 return pkgerrors.Errorf("Key doesn't exist")
\r
110 return json.Unmarshal(getResp.Kvs[0].Value, value)
\r
113 // GetAllKeys values from Etcd DB
\r
114 func (e *EtcdClient) GetAllKeys(key string) ([]string, error) {
\r
117 return nil, pkgerrors.Errorf("Etcd Client not initialized")
\r
119 getResp, err := cli.Get(context.Background(), key, clientv3.WithPrefix())
\r
121 return nil, pkgerrors.Errorf("Error getting etcd entry: %s", err.Error())
\r
123 if getResp.Count == 0 {
\r
124 return nil, pkgerrors.Errorf("Key doesn't exist")
\r
127 for _, ev := range getResp.Kvs {
\r
128 keys = append(keys, string(ev.Key))
\r
133 // DeleteAll keys from Etcd DB
\r
134 func (e *EtcdClient) DeleteAll(key string) error {
\r
137 return pkgerrors.Errorf("Etcd Client not initialized")
\r
139 _, err := cli.Delete(context.Background(), key, clientv3.WithPrefix())
\r
141 return pkgerrors.Errorf("Delete failed etcd entry: %s", err.Error())
\r
146 // Delete values from Etcd DB
\r
147 func (e *EtcdClient) Delete(key string) error {
\r
150 return pkgerrors.Errorf("Etcd Client not initialized")
\r
152 _, err := cli.Delete(context.Background(), key)
\r
154 return pkgerrors.Errorf("Delete failed etcd entry: %s", err.Error())
\r
159 // HealthCheck for checking health of the etcd cluster
\r
160 func (e *EtcdClient) HealthCheck() error {
\r