aboutsummaryrefslogtreecommitdiffstats
path: root/src/k8splugin/db/consul.go
blob: 686d93487aba89128c8898e8d42c977e1cda1ba4 (plain)
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
/*
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 {
	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
}