summaryrefslogtreecommitdiffstats
path: root/src/k8splugin/db
diff options
context:
space:
mode:
authorShashank Kumar Shankar <shashank.kumar.shankar@intel.com>2018-08-20 15:50:50 -0700
committerVictor Morales <victor.morales@intel.com>2018-08-24 15:51:16 -0700
commita1373742a2c3f980360e4980f3b23b0ff3480ae6 (patch)
treece2fb583dea15b8a546d794d21786fdf0f666539 /src/k8splugin/db
parent6ff216219ccb4567baeb34c9dba73daabb60f629 (diff)
Seed code for k8s multicloud plugin
This patch provides the initial seed code for the multicloud Kubernetes plugin and also provides the plugin feature to add new Kubernetes kinds. Change-Id: Ie5ee414656665070cde2834c4855ac2ebc179a9a Issue-ID: MULTICLOUD-301 Signed-off-by: Shashank Kumar Shankar <shashank.kumar.shankar@intel.com> Signed-off-by: Victor Morales <victor.morales@intel.com>
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)
+ }
+ })
+}