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