From c24f2f26c4ed17d9bc6e995245551bfcfab60a47 Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 14 Nov 2024 11:39:36 +0100 Subject: [PATCH] state execution^C --- models/booking/booking.go | 8 +++-- .../collaborative_area/collaborative_area.go | 29 ++++++++++++------- .../collaborative_area_mongo_accessor.go | 17 +++++++++-- models/workflow/workflow_mongo_accessor.go | 4 +-- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/models/booking/booking.go b/models/booking/booking.go index af95cca..d90d12e 100644 --- a/models/booking/booking.go +++ b/models/booking/booking.go @@ -17,7 +17,7 @@ import ( */ type Booking struct { workflow_execution.WorkflowExecution // WorkflowExecution contains the workflow execution data - ComputeResourceID string `json:"compute_resource_id,omitempty" bson:"compute_resource_id,omitempty" validate:"required"` // ComputeResourceID is the ID of the compute resource specified in the booking + ComputeResourceID string `json:"compute_resource_id,omitempty" bson:"compute_resource_id,omitempty" validate:"required"` // ComputeResourceID is the ID of the compute resource specified in the booking } // CheckBooking checks if a booking is possible on a specific compute resource @@ -31,7 +31,7 @@ func (wfa *Booking) CheckBooking(id string, start time.Time, end *time.Time) (bo accessor := wfa.GetAccessor(nil) res, code, err := accessor.Search(&dbs.Filters{ And: map[string][]dbs.Filter{ // check if there is a booking on the same compute resource by filtering on the compute_resource_id, the state and the execution date - "compute_resource_id": {{Operator: dbs.EQUAL.String(), Value: id}}, + "compute_resource_id": {{Operator: dbs.EQUAL.String(), Value: id}}, "workflowexecution.state": {{Operator: dbs.EQUAL.String(), Value: workflow_execution.SCHEDULED.EnumIndex()}}, "workflowexecution.execution_date": { {Operator: dbs.LTE.String(), Value: primitive.NewDateTimeFromTime(e)}, @@ -56,7 +56,9 @@ func (ao *Booking) GetID() string { } func (r *Booking) GenerateID() { - r.UUID = uuid.New().String() + if r.UUID == "" { + r.UUID = uuid.New().String() + } } func (d *Booking) GetName() string { diff --git a/models/collaborative_area/collaborative_area.go b/models/collaborative_area/collaborative_area.go index c68faf5..e7ee16b 100644 --- a/models/collaborative_area/collaborative_area.go +++ b/models/collaborative_area/collaborative_area.go @@ -2,6 +2,7 @@ package collaborative_area import ( "encoding/json" + "time" "cloud.o-forge.io/core/oc-lib/models/collaborative_area/rules/rule" "cloud.o-forge.io/core/oc-lib/models/peer" @@ -12,21 +13,29 @@ import ( "github.com/google/uuid" ) +type CollaborativeAreaRule struct { + ShareMode string `json:"share_mode,omitempty" bson:"share_mode,omitempty"` // Share is the share of the rule + CreatedAt time.Time `json:"created_at,omitempty" bson:"created_at,omitempty"` // CreatedAt is the time the rule was created + Creator string `json:"creator,omitempty" bson:"creator,omitempty"` // Creator is the creator of the rule + ExploitedBy string `json:"exploited_by,omitempty" bson:"exploited_by,omitempty"` // ExploitedBy is the exploited by of the rule +} + // SharedWorkspace is a struct that represents a shared workspace // WARNING : it got a shallow object version, this one is the full version // full version is the one used by API // other one is a shallow version used by the Lib for import cycle problem purposes type CollaborativeArea struct { - utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name) - IsSent bool `json:"is_sent" bson:"-"` // IsSent is a flag that indicates if the workspace is sent - CreatorID string `json:"peer_id,omitempty" bson:"peer_id,omitempty" validate:"required"` // CreatorID is the ID of the creator - Version string `json:"version,omitempty" bson:"version,omitempty"` // Version is the version of the workspace - Description string `json:"description,omitempty" bson:"description,omitempty" validate:"required"` // Description is the description of the workspace - Attributes map[string]interface{} `json:"attributes,omitempty" bson:"attributes,omitempty"` // Attributes is the attributes of the workspace (TODO) - Workspaces []string `json:"workspaces,omitempty" bson:"workspaces,omitempty"` // Workspaces is the workspaces of the workspace - Workflows []string `json:"workflows,omitempty" bson:"workflows,omitempty"` // Workflows is the workflows of the workspace - Peers []string `json:"peers,omitempty" bson:"peers,omitempty"` // Peers is the peers of the workspace - Rules []string `json:"rules,omitempty" bson:"rules,omitempty"` // Rules is the rules of the workspace + utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name) + IsSent bool `json:"is_sent" bson:"-"` // IsSent is a flag that indicates if the workspace is sent + CreatorID string `json:"peer_id,omitempty" bson:"peer_id,omitempty" validate:"required"` // CreatorID is the ID of the creator + Version string `json:"version,omitempty" bson:"version,omitempty"` // Version is the version of the workspace + Description string `json:"description,omitempty" bson:"description,omitempty" validate:"required"` // Description is the description of the workspace + CollaborativeAreaRule *CollaborativeAreaRule `json:"collaborative_area,omitempty" bson:"collaborative_area,omitempty"` // CollaborativeArea is the collaborative area of the workspace + Attributes map[string]interface{} `json:"attributes,omitempty" bson:"attributes,omitempty"` // Attributes is the attributes of the workspace (TODO) + Workspaces []string `json:"workspaces,omitempty" bson:"workspaces,omitempty"` // Workspaces is the workspaces of the workspace + Workflows []string `json:"workflows,omitempty" bson:"workflows,omitempty"` // Workflows is the workflows of the workspace + Peers []string `json:"peers,omitempty" bson:"peers,omitempty"` // Peers is the peers of the workspace + Rules []string `json:"rules,omitempty" bson:"rules,omitempty"` // Rules is the rules of the workspace SharedRules []*rule.Rule `json:"shared_rules,omitempty" bson:"-"` // SharedRules is the shared rules of the workspace SharedWorkspaces []*workspace.Workspace `json:"shared_workspaces,omitempty" bson:"-"` // SharedWorkspaces is the shared workspaces of the workspace diff --git a/models/collaborative_area/collaborative_area_mongo_accessor.go b/models/collaborative_area/collaborative_area_mongo_accessor.go index 20ba8d9..337bf7b 100644 --- a/models/collaborative_area/collaborative_area_mongo_accessor.go +++ b/models/collaborative_area/collaborative_area_mongo_accessor.go @@ -1,8 +1,10 @@ package collaborative_area import ( + "errors" "fmt" "slices" + "time" "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/dbs/mongo" @@ -208,9 +210,20 @@ func (wfa *collaborativeAreaMongoAccessor) StoreOne(data utils.DBObject) (utils. if data.(*CollaborativeArea).Rules == nil { data.(*CollaborativeArea).Rules = []string{} } - + if data.(*CollaborativeArea).CollaborativeAreaRule == nil { + data.(*CollaborativeArea).CollaborativeAreaRule = &CollaborativeAreaRule{ + ShareMode: "private", + ExploitedBy: "collaborators only", + } + } + data.(*CollaborativeArea).CollaborativeAreaRule.CreatedAt = time.Now().UTC() + // retrieve or proper peer + dd, code, err := (&peer.Peer{}).GetAccessor(nil).Search(nil, "0") + if code != 200 || len(dd) == 0 { + return nil, code, errors.New("Could not retrieve the peer" + err.Error()) + } + data.(*CollaborativeArea).CollaborativeAreaRule.Creator = dd[0].GetID() d, code, err := wfa.GenericStoreOne(data.(*CollaborativeArea), wfa) - if code == 200 { wfa.sharedWorkflow(d.(*CollaborativeArea), d.GetID()) // create all shared workflows wfa.sharedWorkspace(d.(*CollaborativeArea), d.GetID()) // create all collaborative areas diff --git a/models/workflow/workflow_mongo_accessor.go b/models/workflow/workflow_mongo_accessor.go index e4b64f9..ad467c7 100644 --- a/models/workflow/workflow_mongo_accessor.go +++ b/models/workflow/workflow_mongo_accessor.go @@ -297,7 +297,7 @@ func (wfa *workflowMongoAccessor) execute(workflow *Workflow, delete bool, activ Processings: workflow.Processings, Storages: workflow.Storages, Workflows: workflow.Workflows, - Computes: workflow.Computes, + Computes: workflow.Computes, }, }, resource[0].GetID()) } else { // if the workspace does not exist, create it @@ -309,7 +309,7 @@ func (wfa *workflowMongoAccessor) execute(workflow *Workflow, delete bool, activ Processings: workflow.Processings, Storages: workflow.Storages, Workflows: workflow.Workflows, - Computes: workflow.Computes, + Computes: workflow.Computes, }, }) }