aboutsummaryrefslogtreecommitdiffstats
path: root/src/k8splugin/internal/rb/definition.go
diff options
context:
space:
mode:
authorKiran Kamineni <kiran.k.kamineni@intel.com>2019-03-15 15:18:12 -0700
committerKiran Kamineni <kiran.k.kamineni@intel.com>2019-03-26 19:19:53 -0700
commitb2b175eae0f4e8b5b0cb9ccbeeca1e98065feeb5 (patch)
treee5a984dd156016b3b615acfd0b903f61e07655ea /src/k8splugin/internal/rb/definition.go
parent1ab1af62578c1c2bf7b3b2e56827fe408cabdbb3 (diff)
Update definition and profile to latest spec
Bringing all the definition and profile code upto the latest spec. Integrated the end to end instance code changes that were made. P9: Added updated plugin.sh with updated uri paths based on spec Issue-ID: MULTICLOUD-291 Change-Id: Id6e3c6bc2cd02cfb7005e203ccf03e0793b97e95 Signed-off-by: Kiran Kamineni <kiran.k.kamineni@intel.com>
Diffstat (limited to 'src/k8splugin/internal/rb/definition.go')
-rw-r--r--src/k8splugin/internal/rb/definition.go95
1 files changed, 59 insertions, 36 deletions
diff --git a/src/k8splugin/internal/rb/definition.go b/src/k8splugin/internal/rb/definition.go
index 2ebbb08a..1c6b1bc5 100644
--- a/src/k8splugin/internal/rb/definition.go
+++ b/src/k8splugin/internal/rb/definition.go
@@ -19,6 +19,7 @@ package rb
import (
"bytes"
"encoding/base64"
+ "encoding/json"
"io/ioutil"
"log"
"os"
@@ -26,35 +27,42 @@ import (
"k8splugin/internal/db"
- uuid "github.com/hashicorp/go-uuid"
pkgerrors "github.com/pkg/errors"
)
// Definition contains the parameters needed for resource bundle (rb) definitions
// It implements the interface for managing the definitions
type Definition struct {
- UUID string `json:"uuid,omitempty"`
- Name string `json:"name"`
- ChartName string `json:"chart-name"`
- Description string `json:"description"`
- ServiceType string `json:"service-type"`
+ Name string `json:"rb-name"`
+ Version string `json:"rb-version"`
+ ChartName string `json:"chart-name"`
+ Description string `json:"description"`
+ Labels map[string]string `json:"labels"`
}
-// DefinitionManager is an interface exposes the resource bundle definition functionality
-type DefinitionManager interface {
- Create(def Definition) (Definition, error)
- List() ([]Definition, error)
- Get(resID string) (Definition, error)
- Delete(resID string) error
- Upload(resID string, inp []byte) error
+type DefinitionKey struct {
+ Name string `json:"rb-name"`
+ Version string `json:"rb-version"`
}
-type definitionKey struct {
- Key string
+// We will use json marshalling to convert to string to
+// preserve the underlying structure.
+func (dk DefinitionKey) String() string {
+ out, err := json.Marshal(dk)
+ if err != nil {
+ return ""
+ }
+
+ return string(out)
}
-func (dk definitionKey) String() string {
- return dk.Key
+// DefinitionManager is an interface exposes the resource bundle definition functionality
+type DefinitionManager interface {
+ Create(def Definition) (Definition, error)
+ List(name string) ([]Definition, error)
+ Get(name string, version string) (Definition, error)
+ Delete(name string, version string) error
+ Upload(name string, version string, inp []byte) error
}
// DefinitionClient implements the DefinitionManager
@@ -77,13 +85,17 @@ func NewDefinitionClient() *DefinitionClient {
// Create an entry for the resource in the database
func (v *DefinitionClient) Create(def Definition) (Definition, error) {
- // If UUID is empty, we will generate one
- if def.UUID == "" {
- def.UUID, _ = uuid.GenerateUUID()
+
+ //Construct composite key consisting of name and version
+ key := DefinitionKey{Name: def.Name, Version: def.Version}
+
+ //Check if this definition already exists
+ _, err := v.Get(def.Name, def.Version)
+ if err == nil {
+ return Definition{}, pkgerrors.New("Definition already exists")
}
- key := definitionKey{Key: def.UUID}
- err := db.DBconn.Create(v.storeName, key, v.tagMeta, def)
+ err = db.DBconn.Create(v.storeName, key, v.tagMeta, def)
if err != nil {
return Definition{}, pkgerrors.Wrap(err, "Creating DB Entry")
}
@@ -91,8 +103,8 @@ func (v *DefinitionClient) Create(def Definition) (Definition, error) {
return def, nil
}
-// List all resource entries in the database
-func (v *DefinitionClient) List() ([]Definition, error) {
+// List all resource entry's versions in the database
+func (v *DefinitionClient) List(name string) ([]Definition, error) {
res, err := db.DBconn.ReadAll(v.storeName, v.tagMeta)
if err != nil || len(res) == 0 {
return []Definition{}, pkgerrors.Wrap(err, "Listing Resource Bundle Definitions")
@@ -108,7 +120,10 @@ func (v *DefinitionClient) List() ([]Definition, error) {
log.Printf("[Definition] Error Unmarshaling value for: %s", key)
continue
}
- results = append(results, def)
+ //Select only the definitions that match name provided
+ if def.Name == name {
+ results = append(results, def)
+ }
}
}
@@ -116,8 +131,10 @@ func (v *DefinitionClient) List() ([]Definition, error) {
}
// Get returns the Resource Bundle Definition for corresponding ID
-func (v *DefinitionClient) Get(id string) (Definition, error) {
- key := definitionKey{Key: id}
+func (v *DefinitionClient) Get(name string, version string) (Definition, error) {
+
+ //Construct the composite key to select the entry
+ key := DefinitionKey{Name: name, Version: version}
value, err := db.DBconn.Read(v.storeName, key, v.tagMeta)
if err != nil {
return Definition{}, pkgerrors.Wrap(err, "Get Resource Bundle definition")
@@ -137,8 +154,10 @@ func (v *DefinitionClient) Get(id string) (Definition, error) {
}
// Delete the Resource Bundle definition from database
-func (v *DefinitionClient) Delete(id string) error {
- key := definitionKey{Key: id}
+func (v *DefinitionClient) Delete(name string, version string) error {
+
+ //Construct the composite key to select the entry
+ key := DefinitionKey{Name: name, Version: version}
err := db.DBconn.Delete(v.storeName, key, v.tagMeta)
if err != nil {
return pkgerrors.Wrap(err, "Delete Resource Bundle Definition")
@@ -154,11 +173,10 @@ func (v *DefinitionClient) Delete(id string) error {
}
// Upload the contents of resource bundle into database
-func (v *DefinitionClient) Upload(id string, inp []byte) error {
+func (v *DefinitionClient) Upload(name string, version string, inp []byte) error {
- key := definitionKey{Key: id}
//Check if definition metadata exists
- def, err := v.Get(id)
+ def, err := v.Get(name, version)
if err != nil {
return pkgerrors.Errorf("Invalid Definition ID provided: %s", err.Error())
}
@@ -168,6 +186,9 @@ func (v *DefinitionClient) Upload(id string, inp []byte) error {
return pkgerrors.Errorf("Error in file format: %s", err.Error())
}
+ //Construct the composite key to select the entry
+ key := DefinitionKey{Name: name, Version: version}
+
//Detect chart name from data if it was not provided originally
if def.ChartName == "" {
path, err := ExtractTarBall(bytes.NewBuffer(inp))
@@ -195,7 +216,8 @@ func (v *DefinitionClient) Upload(id string, inp []byte) error {
return pkgerrors.New("Unable to detect chart name")
}
- _, err = v.Create(def)
+ //TODO: Use db update api once db supports it.
+ err = db.DBconn.Create(v.storeName, key, v.tagMeta, def)
if err != nil {
return pkgerrors.Wrap(err, "Storing updated chart metadata")
}
@@ -214,16 +236,17 @@ func (v *DefinitionClient) Upload(id string, inp []byte) error {
// Download the contents of the resource bundle definition from DB
// Returns a byte array of the contents which is used by the
// ExtractTarBall code to create the folder structure on disk
-func (v *DefinitionClient) Download(id string) ([]byte, error) {
+func (v *DefinitionClient) Download(name string, version string) ([]byte, error) {
- key := definitionKey{Key: id}
//ignore the returned data here
//Check if id is valid
- _, err := v.Get(id)
+ _, err := v.Get(name, version)
if err != nil {
return nil, pkgerrors.Errorf("Invalid Definition ID provided: %s", err.Error())
}
+ //Construct the composite key to select the entry
+ key := DefinitionKey{Name: name, Version: version}
value, err := db.DBconn.Read(v.storeName, key, v.tagContent)
if err != nil {
return nil, pkgerrors.Wrap(err, "Get Resource Bundle definition content")