diff options
author | Igor D.C <igor.duarte.cardoso@intel.com> | 2020-10-01 17:50:20 +0000 |
---|---|---|
committer | Igor D.C <igor.duarte.cardoso@intel.com> | 2020-10-02 22:56:05 +0000 |
commit | a1df0c268ffe34884b115fb3873c2d4ba6ad27b8 (patch) | |
tree | 384413abb6346dcbc4d63a67c60c578fb3823434 /src/dcm/pkg/module/logicalcloud.go | |
parent | 44c33f538cf03455c3fd32f837f56f31957bb4a0 (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.go | 66 |
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 + +} |