summaryrefslogtreecommitdiffstats
path: root/src/dcm/pkg/module/logicalcloud.go
diff options
context:
space:
mode:
authorIgor D.C <igor.duarte.cardoso@intel.com>2020-10-01 17:50:20 +0000
committerIgor D.C <igor.duarte.cardoso@intel.com>2020-10-02 22:56:05 +0000
commita1df0c268ffe34884b115fb3873c2d4ba6ad27b8 (patch)
tree384413abb6346dcbc4d63a67c60c578fb3823434 /src/dcm/pkg/module/logicalcloud.go
parent44c33f538cf03455c3fd32f837f56f31957bb4a0 (diff)
Reimplement Terminate to be compatible with Status
This also includes modifying Apply and Delete, since there are strict conditions that need to be met in each, to prevent Logical Clouds (LCs) from entering a bad state. Summary of what's being done here: - When applying: - set tag 'lccontext' in the LC to the context ID (was already done) - and let rsync know about the appcontext (grpc) (was already done) - if tag was already set, check current context /status - if context /status is actually Terminated, 'lccontext' is set to new context ID and previous AppContext deleted - When terminating: - lets rsync know about the termination request (grpc) - When deleting: - checks whether the current context /status is Terminated - if it is, then it will remove the latest LC context This particular commit disables the TestDeleteLogicalCloud test until a known issue behind the test is resolved. This commit does not leverage the full capacity of the Status framework, but is sufficient to support all operations. A future patch will entirely migrate DCM to the Status framework. Until then, a known issue exists where DCM will forget about context IDs previously associated to a particular Logical Cloud (only keeps last). Issue-ID: MULTICLOUD-1143 Change-Id: I7a6034eba543c2a27daa41b7fe6298cb2a85f9ce Signed-off-by: Igor D.C <igor.duarte.cardoso@intel.com>
Diffstat (limited to 'src/dcm/pkg/module/logicalcloud.go')
-rw-r--r--src/dcm/pkg/module/logicalcloud.go66
1 files changed, 59 insertions, 7 deletions
diff --git a/src/dcm/pkg/module/logicalcloud.go b/src/dcm/pkg/module/logicalcloud.go
index 3ecb6288..580e9022 100644
--- a/src/dcm/pkg/module/logicalcloud.go
+++ b/src/dcm/pkg/module/logicalcloud.go
@@ -17,6 +17,8 @@
package module
import (
+ "encoding/json"
+
"github.com/onap/multicloud-k8s/src/orchestrator/pkg/appcontext"
"github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
"github.com/onap/multicloud-k8s/src/orchestrator/pkg/module"
@@ -133,7 +135,7 @@ func (v *LogicalCloudClient) Create(project string, c LogicalCloud) (LogicalClou
err = v.util.DBInsert(v.storeName, key, nil, v.tagMeta, c)
if err != nil {
- return LogicalCloud{}, pkgerrors.Wrap(err, "Creating DB Entry")
+ return LogicalCloud{}, pkgerrors.Wrap(err, "Error creating DB Entry")
}
return c, nil
@@ -205,12 +207,40 @@ func (v *LogicalCloudClient) Delete(project, logicalCloudName string) error {
if err != nil {
return pkgerrors.New("Logical Cloud does not exist")
}
- err = v.util.DBRemove(v.storeName, key)
+
+ context, _, err := v.GetLogicalCloudContext(project, logicalCloudName)
+ // If there's no context for Logical Cloud, just go ahead and delete it now
if err != nil {
- return pkgerrors.Wrap(err, "Delete Logical Cloud")
+ err = v.util.DBRemove(v.storeName, key)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Error when deleting Logical Cloud")
+ }
+ return nil
}
- return nil
+ // Make sure rsync status for this logical cloud is Terminated,
+ // otherwise we can't remove appcontext yet
+ acStatus, _ := getAppContextStatus(context)
+ switch acStatus.Status {
+ case appcontext.AppContextStatusEnum.Terminated:
+ // remove the appcontext
+ err := context.DeleteCompositeApp()
+ if err != nil {
+ return pkgerrors.Wrap(err, "Error deleting AppContext CompositeApp Logical Cloud")
+ }
+
+ err = v.util.DBRemove(v.storeName, key)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Error when deleting Logical Cloud")
+ }
+ return nil
+ case appcontext.AppContextStatusEnum.Terminating:
+ return pkgerrors.New("The Logical Cloud can't be deleted yet, it is being terminated.")
+ case appcontext.AppContextStatusEnum.Instantiated:
+ return pkgerrors.New("The Logical Cloud is applied, please terminate first.")
+ default:
+ return pkgerrors.New("The Logical Cloud can't be deleted yet at this point.")
+ }
}
// Update an entry for the Logical Cloud in the database
@@ -236,7 +266,7 @@ func (v *LogicalCloudClient) Update(project, logicalCloudName string, c LogicalC
return c, nil
}
-// GetClusterContext returns the AppContext for corresponding provider and name
+// GetLogicalCloudContext returns the AppContext for corresponding provider and name
func (v *LogicalCloudClient) GetLogicalCloudContext(project string, name string) (appcontext.AppContext, string, error) {
//Construct key and tag to select the entry
key := LogicalCloudKey{
@@ -244,12 +274,12 @@ func (v *LogicalCloudClient) GetLogicalCloudContext(project string, name string)
Project: project,
}
- value, err := db.DBconn.Find(v.storeName, key, v.tagContext)
+ value, err := v.util.DBFind(v.storeName, key, v.tagContext)
if err != nil {
return appcontext.AppContext{}, "", pkgerrors.Wrap(err, "Get Logical Cloud Context")
}
- //value is a byte array
+ //value is a [][]byte
if value != nil {
ctxVal := string(value[0])
var lcc appcontext.AppContext
@@ -322,3 +352,25 @@ func (d DBService) CheckLogicalCloud(project, logicalCloud string) error {
return nil
}
+
+func getAppContextStatus(ac appcontext.AppContext) (*appcontext.AppContextStatus, error) {
+
+ h, err := ac.GetCompositeAppHandle()
+ if err != nil {
+ return nil, err
+ }
+ sh, err := ac.GetLevelHandle(h, "status")
+ if err != nil {
+ return nil, err
+ }
+ s, err := ac.GetValue(sh)
+ if err != nil {
+ return nil, err
+ }
+ acStatus := appcontext.AppContextStatus{}
+ js, _ := json.Marshal(s)
+ json.Unmarshal(js, &acStatus)
+
+ return &acStatus, nil
+
+}