summaryrefslogtreecommitdiffstats
path: root/src/k8splugin/db
diff options
context:
space:
mode:
Diffstat (limited to 'src/k8splugin/db')
-rw-r--r--src/k8splugin/db/DB.go42
-rw-r--r--src/k8splugin/db/consul.go112
-rw-r--r--src/k8splugin/db/db_test.go40
3 files changed, 194 insertions, 0 deletions
diff --git a/src/k8splugin/db/DB.go b/src/k8splugin/db/DB.go
new file mode 100644
index 00000000..c8895088
--- /dev/null
+++ b/src/k8splugin/db/DB.go
@@ -0,0 +1,42 @@
+/*
+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 (
+ pkgerrors "github.com/pkg/errors"
+)
+
+// DBconn interface used to talk a concrete Database connection
+var DBconn DatabaseConnection
+
+// DatabaseConnection is an interface for accessing a database
+type DatabaseConnection interface {
+ InitializeDatabase() error
+ CheckDatabase() error
+ CreateEntry(string, string) error
+ ReadEntry(string) (string, bool, error)
+ DeleteEntry(string) error
+ ReadAll(string) ([]string, error)
+}
+
+// CreateDBClient creates the DB client
+var CreateDBClient = func(dbType string) error {
+ switch dbType {
+ case "consul":
+ DBconn = &ConsulDB{}
+ return nil
+ default:
+ return pkgerrors.New(dbType + "DB not supported")
+ }
+}
diff --git a/src/k8splugin/db/consul.go b/src/k8splugin/db/consul.go
new file mode 100644
index 00000000..9ab0d826
--- /dev/null
+++ b/src/k8splugin/db/consul.go
@@ -0,0 +1,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
+}
diff --git a/src/k8splugin/db/db_test.go b/src/k8splugin/db/db_test.go
new file mode 100644
index 00000000..7ad252f5
--- /dev/null
+++ b/src/k8splugin/db/db_test.go
@@ -0,0 +1,40 @@
+/*
+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 (
+ "reflect"
+ "testing"
+)
+
+func TestCreateDBClient(t *testing.T) {
+ oldDBconn := DBconn
+
+ defer func() {
+ DBconn = oldDBconn
+ }()
+
+ t.Run("Successfully create DB client", func(t *testing.T) {
+ expectedDB := ConsulDB{}
+
+ err := CreateDBClient("consul")
+ if err != nil {
+ t.Fatalf("TestCreateDBClient returned an error (%s)", err)
+ }
+
+ if !reflect.DeepEqual(DBconn, &expectedDB) {
+ t.Fatalf("TestCreateDBClient set DBconn as:\n result=%v\n expected=%v", DBconn, expectedDB)
+ }
+ })
+}