From c309d976235086ec1177bede2a714c76434c3eb2 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 2 Oct 2024 12:23:22 +0200 Subject: [PATCH] correct share infinite loop --- entrypoint.go | 4 ++-- .../collaborative_area.go | 2 +- .../collaborative_area_mongo_accessor.go | 6 +++--- .../rules/rule/rule.go | 0 .../rules/rule/rule_mongo_accessor.go | 0 .../shallow_collaborative_area.go | 0 .../shallow_collaborative_area_mongo_accessor.go | 0 models/models.go | 4 ++-- models/resource_model/resource_model.go | 2 ++ models/utils/abstracts.go | 13 +++++++++++-- models/utils/interfaces.go | 1 + models/workflow/workflow_mongo_accessor.go | 8 +++----- models/workspace/workspace_mongo_accessor.go | 12 ++++++------ tools/remote_caller.go | 6 ++++-- 14 files changed, 35 insertions(+), 23 deletions(-) rename models/{workspace/shared => collaborative_area}/collaborative_area.go (98%) rename models/{workspace/shared => collaborative_area}/collaborative_area_mongo_accessor.go (98%) rename models/{workspace/shared => collaborative_area}/rules/rule/rule.go (100%) rename models/{workspace/shared => collaborative_area}/rules/rule/rule_mongo_accessor.go (100%) rename models/{workspace/shared => collaborative_area}/shallow_collaborative_area/shallow_collaborative_area.go (100%) rename models/{workspace/shared => collaborative_area}/shallow_collaborative_area/shallow_collaborative_area_mongo_accessor.go (100%) diff --git a/entrypoint.go b/entrypoint.go index 6fd68aa..500d099 100644 --- a/entrypoint.go +++ b/entrypoint.go @@ -11,6 +11,8 @@ import ( "cloud.o-forge.io/core/oc-lib/dbs/mongo" "cloud.o-forge.io/core/oc-lib/logs" "cloud.o-forge.io/core/oc-lib/models" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area/rules/rule" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/resource_model" "cloud.o-forge.io/core/oc-lib/models/resources/data" @@ -22,8 +24,6 @@ import ( w2 "cloud.o-forge.io/core/oc-lib/models/workflow" "cloud.o-forge.io/core/oc-lib/models/workflow_execution" "cloud.o-forge.io/core/oc-lib/models/workspace" - collaborative_area "cloud.o-forge.io/core/oc-lib/models/workspace/shared" - "cloud.o-forge.io/core/oc-lib/models/workspace/shared/rules/rule" "cloud.o-forge.io/core/oc-lib/tools" "github.com/goraz/onion" "github.com/rs/zerolog" diff --git a/models/workspace/shared/collaborative_area.go b/models/collaborative_area/collaborative_area.go similarity index 98% rename from models/workspace/shared/collaborative_area.go rename to models/collaborative_area/collaborative_area.go index 5f40f3f..c68faf5 100644 --- a/models/workspace/shared/collaborative_area.go +++ b/models/collaborative_area/collaborative_area.go @@ -3,11 +3,11 @@ package collaborative_area import ( "encoding/json" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area/rules/rule" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/utils" w "cloud.o-forge.io/core/oc-lib/models/workflow" "cloud.o-forge.io/core/oc-lib/models/workspace" - "cloud.o-forge.io/core/oc-lib/models/workspace/shared/rules/rule" "cloud.o-forge.io/core/oc-lib/tools" "github.com/google/uuid" ) diff --git a/models/workspace/shared/collaborative_area_mongo_accessor.go b/models/collaborative_area/collaborative_area_mongo_accessor.go similarity index 98% rename from models/workspace/shared/collaborative_area_mongo_accessor.go rename to models/collaborative_area/collaborative_area_mongo_accessor.go index af59ad6..a46e333 100644 --- a/models/workspace/shared/collaborative_area_mongo_accessor.go +++ b/models/collaborative_area/collaborative_area_mongo_accessor.go @@ -6,11 +6,11 @@ import ( "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/dbs/mongo" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area/rules/rule" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/utils" w "cloud.o-forge.io/core/oc-lib/models/workflow" "cloud.o-forge.io/core/oc-lib/models/workspace" - "cloud.o-forge.io/core/oc-lib/models/workspace/shared/rules/rule" "cloud.o-forge.io/core/oc-lib/static" "cloud.o-forge.io/core/oc-lib/tools" ) @@ -150,7 +150,7 @@ func (wfa *collaborativeAreaMongoAccessor) sharedWorkflow(shared *CollaborativeA // sharedWorkspace is a function that shares the collaborative area to the peers func (wfa *collaborativeAreaMongoAccessor) deleteToPeer(shared *CollaborativeArea) { - if wfa.Caller == nil || wfa.Caller.URLS == nil || wfa.Caller.URLS[tools.COLLABORATIVE_AREA] == nil { + if wfa.Caller == nil || wfa.Caller.URLS == nil || wfa.Caller.URLS[tools.COLLABORATIVE_AREA] == nil || wfa.Caller.Disabled { return } paccess := (&peer.Peer{}) @@ -167,7 +167,7 @@ func (wfa *collaborativeAreaMongoAccessor) deleteToPeer(shared *CollaborativeAre // sharedWorkspace is a function that shares the collaborative area to the peers func (wfa *collaborativeAreaMongoAccessor) sendToPeer(shared *CollaborativeArea) { - if wfa.Caller == nil || wfa.Caller.URLS == nil || wfa.Caller.URLS[tools.COLLABORATIVE_AREA] == nil { + if wfa.Caller == nil || wfa.Caller.URLS == nil || wfa.Caller.URLS[tools.COLLABORATIVE_AREA] == nil || wfa.Caller.Disabled { return } diff --git a/models/workspace/shared/rules/rule/rule.go b/models/collaborative_area/rules/rule/rule.go similarity index 100% rename from models/workspace/shared/rules/rule/rule.go rename to models/collaborative_area/rules/rule/rule.go diff --git a/models/workspace/shared/rules/rule/rule_mongo_accessor.go b/models/collaborative_area/rules/rule/rule_mongo_accessor.go similarity index 100% rename from models/workspace/shared/rules/rule/rule_mongo_accessor.go rename to models/collaborative_area/rules/rule/rule_mongo_accessor.go diff --git a/models/workspace/shared/shallow_collaborative_area/shallow_collaborative_area.go b/models/collaborative_area/shallow_collaborative_area/shallow_collaborative_area.go similarity index 100% rename from models/workspace/shared/shallow_collaborative_area/shallow_collaborative_area.go rename to models/collaborative_area/shallow_collaborative_area/shallow_collaborative_area.go diff --git a/models/workspace/shared/shallow_collaborative_area/shallow_collaborative_area_mongo_accessor.go b/models/collaborative_area/shallow_collaborative_area/shallow_collaborative_area_mongo_accessor.go similarity index 100% rename from models/workspace/shared/shallow_collaborative_area/shallow_collaborative_area_mongo_accessor.go rename to models/collaborative_area/shallow_collaborative_area/shallow_collaborative_area_mongo_accessor.go diff --git a/models/models.go b/models/models.go index e4305fe..becf109 100644 --- a/models/models.go +++ b/models/models.go @@ -5,6 +5,8 @@ import ( "cloud.o-forge.io/core/oc-lib/tools" "cloud.o-forge.io/core/oc-lib/models/booking" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area/rules/rule" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/resource_model" d "cloud.o-forge.io/core/oc-lib/models/resources/data" @@ -15,8 +17,6 @@ import ( w2 "cloud.o-forge.io/core/oc-lib/models/workflow" "cloud.o-forge.io/core/oc-lib/models/workflow_execution" w3 "cloud.o-forge.io/core/oc-lib/models/workspace" - collaborative_area "cloud.o-forge.io/core/oc-lib/models/workspace/shared" - "cloud.o-forge.io/core/oc-lib/models/workspace/shared/rules/rule" ) /* diff --git a/models/resource_model/resource_model.go b/models/resource_model/resource_model.go index eede3d8..17fc3fb 100644 --- a/models/resource_model/resource_model.go +++ b/models/resource_model/resource_model.go @@ -83,6 +83,8 @@ func (ao *ResourceModel) GetID() string { return ao.UUID } +func (ao *ResourceModel) UpToDate() {} + func (r *ResourceModel) GenerateID() { r.UUID = uuid.New().String() } diff --git a/models/utils/abstracts.go b/models/utils/abstracts.go index cd6c45d..be6946a 100644 --- a/models/utils/abstracts.go +++ b/models/utils/abstracts.go @@ -3,10 +3,12 @@ package utils import ( "encoding/json" "errors" + "time" "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/dbs/mongo" "cloud.o-forge.io/core/oc-lib/logs" + "cloud.o-forge.io/core/oc-lib/static" "cloud.o-forge.io/core/oc-lib/tools" "github.com/go-playground/validator/v10" "github.com/google/uuid" @@ -22,8 +24,10 @@ var validate = validator.New(validator.WithRequiredStructEnabled()) * every data in base root model should inherit from this struct (only exception is the ResourceModel) */ type AbstractObject struct { - UUID string `json:"id,omitempty" bson:"id,omitempty" validate:"required"` - Name string `json:"name,omitempty" bson:"name,omitempty" validate:"required"` + UUID string `json:"id,omitempty" bson:"id,omitempty" validate:"required"` + Name string `json:"name,omitempty" bson:"name,omitempty" validate:"required"` + UpdateDate time.Time `json:"update_date" bson:"update_date"` + LastPeerWriter string `json:"last_peer_writer" bson:"last_peer_writer"` } // GetID returns the id of the object (abstract) @@ -36,6 +40,11 @@ func (ao *AbstractObject) GetName() string { return ao.Name } +func (ao *AbstractObject) UpToDate() { + ao.UpdateDate = time.Now() + ao.LastPeerWriter, _ = static.GetMyLocalJsonPeer() +} + // GetAccessor returns the accessor of the object (abstract) func (dma *AbstractObject) GetAccessor(caller *tools.HTTPCaller) Accessor { return nil diff --git a/models/utils/interfaces.go b/models/utils/interfaces.go index ef2ebdb..55af0cb 100644 --- a/models/utils/interfaces.go +++ b/models/utils/interfaces.go @@ -19,6 +19,7 @@ type DBObject interface { GenerateID() GetID() string GetName() string + UpToDate() Deserialize(j map[string]interface{}) DBObject Serialize() map[string]interface{} GetAccessor(caller *tools.HTTPCaller) Accessor diff --git a/models/workflow/workflow_mongo_accessor.go b/models/workflow/workflow_mongo_accessor.go index 12f0036..82327e8 100644 --- a/models/workflow/workflow_mongo_accessor.go +++ b/models/workflow/workflow_mongo_accessor.go @@ -7,13 +7,13 @@ import ( "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/dbs/mongo" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area/shallow_collaborative_area" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/models/resources/datacenter" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/models/workflow_execution" "cloud.o-forge.io/core/oc-lib/models/workspace" - "cloud.o-forge.io/core/oc-lib/models/workspace/shared/shallow_collaborative_area" "cloud.o-forge.io/core/oc-lib/tools" cron "github.com/robfig/cron/v3" ) @@ -158,7 +158,7 @@ func (wfa *workflowMongoAccessor) book(id string, realData *Workflow, execs []*w * share is a function that shares a workflow to the peers if the workflow is shared */ func (wfa *workflowMongoAccessor) share(realData *Workflow, delete bool, caller *tools.HTTPCaller) { - if realData.Shared == nil || len(realData.Shared) == 0 { // no shared no sharing + if realData.Shared == nil || len(realData.Shared) == 0 || caller.Disabled { // no shared no sharing return } for _, sharedID := range realData.Shared { // loop through the shared ids @@ -280,7 +280,6 @@ func (wfa *workflowMongoAccessor) CopyOne(data utils.DBObject) (utils.DBObject, func (wfa *workflowMongoAccessor) execute(workflow *Workflow, delete bool, active bool) { accessor := (&workspace.Workspace{}).GetAccessor(nil) - fmt.Println("DEL", workflow.Name+"_workspace", delete) filters := &dbs.Filters{ Or: map[string][]dbs.Filter{ // filter by standard workspace name attached to a workflow "abstractobject.name": {{dbs.LIKE.String(), workflow.Name + "_workspace"}}, @@ -289,8 +288,7 @@ func (wfa *workflowMongoAccessor) execute(workflow *Workflow, delete bool, activ resource, _, err := accessor.Search(filters, "") if delete { // if delete is set to true, delete the workspace for _, r := range resource { - rr, c, err := accessor.DeleteOne(r.GetID()) - fmt.Println("DEL", rr, c, err) + accessor.DeleteOne(r.GetID()) } return } diff --git a/models/workspace/workspace_mongo_accessor.go b/models/workspace/workspace_mongo_accessor.go index d36925c..b74a6b7 100644 --- a/models/workspace/workspace_mongo_accessor.go +++ b/models/workspace/workspace_mongo_accessor.go @@ -5,6 +5,7 @@ import ( "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/dbs/mongo" + "cloud.o-forge.io/core/oc-lib/models/collaborative_area/shallow_collaborative_area" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/resources/data" "cloud.o-forge.io/core/oc-lib/models/resources/datacenter" @@ -12,7 +13,6 @@ import ( "cloud.o-forge.io/core/oc-lib/models/resources/storage" w "cloud.o-forge.io/core/oc-lib/models/resources/workflow" "cloud.o-forge.io/core/oc-lib/models/utils" - "cloud.o-forge.io/core/oc-lib/models/workspace/shared/shallow_collaborative_area" "cloud.o-forge.io/core/oc-lib/tools" ) @@ -31,7 +31,7 @@ func New() *workspaceMongoAccessor { func (wfa *workspaceMongoAccessor) DeleteOne(id string) (utils.DBObject, int, error) { res, code, err := wfa.GenericDeleteOne(id, wfa) if code == 200 && res != nil { - wfa.share(res.(*Workspace), true, wfa.Caller) // Share the deletion to the peers + wfa.share(res.(*Workspace), tools.DELETE, wfa.Caller) // Share the deletion to the peers } return res, code, err } @@ -57,7 +57,7 @@ func (wfa *workspaceMongoAccessor) UpdateOne(set utils.DBObject, id string) (uti } res, code, err := wfa.GenericUpdateOne(set, id, wfa, &Workspace{}) if code == 200 && res != nil { - wfa.share(res.(*Workspace), false, wfa.Caller) + wfa.share(res.(*Workspace), tools.PUT, wfa.Caller) } return res, code, err } @@ -204,8 +204,8 @@ func (wfa *workspaceMongoAccessor) Search(filters *dbs.Filters, search string) ( /* This function is used to share the workspace with the peers */ -func (wfa *workspaceMongoAccessor) share(realData *Workspace, delete bool, caller *tools.HTTPCaller) { - if realData.Shared == "" { +func (wfa *workspaceMongoAccessor) share(realData *Workspace, method tools.METHOD, caller *tools.HTTPCaller) { + if realData.Shared == "" || caller.Disabled { return } access := (&shallow_collaborative_area.ShallowCollaborativeArea{}).GetAccessor(nil) @@ -220,7 +220,7 @@ func (wfa *workspaceMongoAccessor) share(realData *Workspace, delete bool, calle if paccess.IsMySelf() { // If the peer is the current peer, never share because it will create a loop continue } - if delete { // If the workspace is deleted, share the deletion + if method == tools.DELETE { // If the workspace is deleted, share the deletion history := NewHistory() history.StoreOne(history.MapFromWorkspace(res.(*Workspace))) _, err = paccess.LaunchPeerExecution(p, res.GetID(), tools.WORKSPACE, tools.DELETE, map[string]interface{}{}, caller) diff --git a/tools/remote_caller.go b/tools/remote_caller.go index e0a1361..c28b1f2 100644 --- a/tools/remote_caller.go +++ b/tools/remote_caller.go @@ -40,13 +40,15 @@ func ToMethod(str string) METHOD { var HTTPCallerInstance = &HTTPCaller{} // Singleton instance of the HTTPCaller type HTTPCaller struct { - URLS map[DataType]map[METHOD]string // Map of the different methods and their urls + URLS map[DataType]map[METHOD]string // Map of the different methods and their urls + Disabled bool // Disabled flag } // NewHTTPCaller creates a new instance of the HTTP Caller func NewHTTPCaller(urls map[DataType]map[METHOD]string) *HTTPCaller { return &HTTPCaller{ - URLS: urls, // Set the urls defined in the config & based on the data name type & method + URLS: urls, // Set the urls defined in the config & based on the data name type & method + Disabled: false, } }