aboutsummaryrefslogtreecommitdiffstats
path: root/src/k8splugin/internal/db/consul.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/k8splugin/internal/db/consul.go')
-rw-r--r--src/k8splugin/internal/db/consul.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/k8splugin/internal/db/consul.go b/src/k8splugin/internal/db/consul.go
new file mode 100644
index 00000000..a61a4c10
--- /dev/null
+++ b/src/k8splugin/internal/db/consul.go
@@ -0,0 +1,118 @@
+/*
+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 (
+ "os"
+
+ "github.com/hashicorp/consul/api"
+ pkgerrors "github.com/pkg/errors"
+)
+
+// ConsulKVStore defines the a subset of Consul DB operations
+// Note: This interface is defined mainly for allowing mock testing
+type ConsulKVStore interface {
+ List(prefix string, q *api.QueryOptions) (api.KVPairs, *api.QueryMeta, error)
+ Get(key string, q *api.QueryOptions) (*api.KVPair, *api.QueryMeta, error)
+ Put(p *api.KVPair, q *api.WriteOptions) (*api.WriteMeta, error)
+ Delete(key string, w *api.WriteOptions) (*api.WriteMeta, error)
+}
+
+// ConsulStore is an implementation of the ConsulKVStore interface
+type ConsulStore struct {
+ client ConsulKVStore
+}
+
+// NewConsulStore initializes a Consul Store instance using the default values
+func NewConsulStore(store ConsulKVStore) (Store, error) {
+ if store == nil {
+ config := api.DefaultConfig()
+ config.Address = os.Getenv("DATABASE_IP") + ":8500"
+
+ consulClient, err := api.NewClient(config)
+ if err != nil {
+ return nil, err
+ }
+ store = consulClient.KV()
+ }
+
+ return &ConsulStore{
+ client: store,
+ }, nil
+}
+
+// HealthCheck verifies if the database is up and running
+func (c *ConsulStore) HealthCheck() error {
+ _, err := c.Read("test", "test", "test")
+ if err != nil {
+ return pkgerrors.New("[ERROR] Cannot talk to Datastore. Check if it is running/reachable.")
+ }
+ return nil
+}
+
+// Unmarshal implements any unmarshaling that is needed when using consul
+func (c *ConsulStore) Unmarshal(inp []byte, out interface{}) error {
+ return nil
+}
+
+// Create is used to create a DB entry
+func (c *ConsulStore) Create(root, key, tag string, data interface{}) error {
+
+ value, err := Serialize(data)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Serializing input data")
+ }
+
+ p := &api.KVPair{
+ Key: key,
+ Value: []byte(value),
+ }
+ _, err = c.client.Put(p, nil)
+ return err
+}
+
+// Read method returns the internalID for a particular externalID
+func (c *ConsulStore) Read(root, key, tag string) ([]byte, error) {
+ key = root + "/" + key + "/" + tag
+ pair, _, err := c.client.Get(key, nil)
+ if err != nil {
+ return nil, err
+ }
+ if pair == nil {
+ return nil, nil
+ }
+ return pair.Value, nil
+}
+
+// Delete method removes an internalID from the Database
+func (c *ConsulStore) Delete(root, key, tag string) error {
+ _, err := c.client.Delete(key, nil)
+ return err
+}
+
+// ReadAll is used to get all ExternalIDs in a namespace
+func (c *ConsulStore) ReadAll(root, tag string) (map[string][]byte, error) {
+ pairs, _, err := c.client.List(root, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ //TODO: Filter results by tag and return it
+ result := make(map[string][]byte)
+ for _, keypair := range pairs {
+ result[keypair.Key] = keypair.Value
+ }
+
+ return result, nil
+}