1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/*
Copyright 2018 Intel Corporation.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package db
import (
consulapi "github.com/hashicorp/consul/api"
pkgerrors "github.com/pkg/errors"
"os"
)
// ConsulDB is an implementation of the DatabaseConnection interface
type ConsulDB struct {
consulClient *consulapi.Client
}
// InitializeDatabase initialized the initial steps
func (c *ConsulDB) InitializeDatabase() error {
if os.Getenv("DATABASE_IP") == "" {
return pkgerrors.New("DATABASE_IP environment variable not set.")
}
config := consulapi.DefaultConfig()
config.Address = os.Getenv("DATABASE_IP") + ":8500"
client, err := consulapi.NewClient(config)
if err != nil {
return err
}
c.consulClient = client
return nil
}
// CheckDatabase checks if the database is running
func (c *ConsulDB) CheckDatabase() error {
kv := c.consulClient.KV()
_, _, err := kv.Get("test", nil)
if err != nil {
return pkgerrors.New("[ERROR] Cannot talk to Datastore. Check if it is running/reachable.")
}
return nil
}
// CreateEntry is used to create a DB entry
func (c *ConsulDB) CreateEntry(key string, value string) error {
kv := c.consulClient.KV()
p := &consulapi.KVPair{Key: key, Value: []byte(value)}
_, err := kv.Put(p, nil)
if err != nil {
return err
}
return nil
}
// ReadEntry returns the internalID for a particular externalID is present in a namespace
func (c *ConsulDB) ReadEntry(key string) (string, bool, error) {
kv := c.consulClient.KV()
pair, _, err := kv.Get(key, nil)
if pair == nil {
return string("No value found for ID: " + key), false, err
}
return string(pair.Value), true, err
}
// DeleteEntry is used to delete an ID
func (c *ConsulDB) DeleteEntry(key string) error {
kv := c.consulClient.KV()
_, err := kv.Delete(key, nil)
if err != nil {
return err
}
return nil
}
// ReadAll is used to get all ExternalIDs in a namespace
func (c *ConsulDB) ReadAll(prefix string) ([]string, error) {
kv := c.consulClient.KV()
pairs, _, err := kv.List(prefix, nil)
if len(pairs) == 0 {
return []string{""}, err
}
var res []string
for _, keypair := range pairs {
res = append(res, keypair.Key)
}
return res, err
}
|