From 3ff7b47995c9268852a14e8e2ded6ec97891f216 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 27 Jan 2025 16:02:45 +0100 Subject: [PATCH] adding inputs output struct based on argo naming for now --- models/common/models/inoutputs.go | 7 +- models/models.go | 2 - models/resources/data.go | 19 ++++++ models/resources/interfaces.go | 3 +- models/resources/processing.go | 12 +++- models/resources/resource.go | 47 +++----------- models/resources/resource_accessor.go | 22 +------ .../resource_model/resource_model.go | 64 ------------------- .../resource_model_mongo_accessor.go | 62 ------------------ models/utils/abstracts.go | 4 ++ 10 files changed, 51 insertions(+), 191 deletions(-) delete mode 100644 models/resources/resource_model/resource_model.go delete mode 100644 models/resources/resource_model/resource_model_mongo_accessor.go diff --git a/models/common/models/inoutputs.go b/models/common/models/inoutputs.go index 5381b84..1850ff8 100644 --- a/models/common/models/inoutputs.go +++ b/models/common/models/inoutputs.go @@ -7,9 +7,10 @@ type Artifact struct { } type Param struct { - Attr string `json:"attr" bson:"attr" validate:"required"` - Value string `json:"value,omitempty" bson:"value,omitempty"` - Readonly bool `json:"readonly" bson:"readonly" default:"true"` + Attr string `json:"attr" bson:"attr" validate:"required"` + Value string `json:"value,omitempty" bson:"value,omitempty"` + Readonly bool `json:"readonly" bson:"readonly" default:"true"` + Optionnal bool `json:"optionnal" bson:"optionnal" default:"true"` } type InOutputs struct { diff --git a/models/models.go b/models/models.go index 1793248..f749597 100644 --- a/models/models.go +++ b/models/models.go @@ -10,7 +10,6 @@ import ( "cloud.o-forge.io/core/oc-lib/models/collaborative_area/rules/rule" "cloud.o-forge.io/core/oc-lib/models/peer" resource "cloud.o-forge.io/core/oc-lib/models/resources" - "cloud.o-forge.io/core/oc-lib/models/resources/resource_model" "cloud.o-forge.io/core/oc-lib/models/utils" w2 "cloud.o-forge.io/core/oc-lib/models/workflow" "cloud.o-forge.io/core/oc-lib/models/workflow_execution" @@ -30,7 +29,6 @@ var models = map[string]func() utils.DBObject{ tools.WORKFLOW.String(): func() utils.DBObject { return &w2.Workflow{} }, tools.WORKFLOW_EXECUTION.String(): func() utils.DBObject { return &workflow_execution.WorkflowExecutions{} }, tools.WORKSPACE.String(): func() utils.DBObject { return &w3.Workspace{} }, - tools.RESOURCE_MODEL.String(): func() utils.DBObject { return &resource_model.ResourceModel{} }, tools.PEER.String(): func() utils.DBObject { return &peer.Peer{} }, tools.COLLABORATIVE_AREA.String(): func() utils.DBObject { return &collaborative_area.CollaborativeArea{} }, tools.RULE.String(): func() utils.DBObject { return &rule.Rule{} }, diff --git a/models/resources/data.go b/models/resources/data.go index 47685c8..520e972 100644 --- a/models/resources/data.go +++ b/models/resources/data.go @@ -4,6 +4,7 @@ import ( "errors" "time" + "cloud.o-forge.io/core/oc-lib/models/common/models" "cloud.o-forge.io/core/oc-lib/models/common/pricing" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/tools" @@ -52,6 +53,24 @@ type DataInstance struct { Source string `json:"source" bson:"source"` // Source is the source of the data } +func (ri *DataInstance) StoreDraftDefault() { + found := false + for _, p := range ri.ResourceInstance.Outputs { + if p.Attr == "source" { + found = true + break + } + } + if !found { + ri.ResourceInstance.Outputs = append(ri.ResourceInstance.Outputs, models.Param{ + Attr: "source", + Value: ri.Source, + Readonly: true, + }) + } + ri.ResourceInstance.StoreDraftDefault() +} + type DataResourcePartnership struct { ResourcePartnerShip[*DataResourcePricingProfile] MaxDownloadableGbAllowed float64 `json:"allowed_gb,omitempty" bson:"allowed_gb,omitempty"` diff --git a/models/resources/interfaces.go b/models/resources/interfaces.go index 05f74a6..16d1c05 100644 --- a/models/resources/interfaces.go +++ b/models/resources/interfaces.go @@ -2,7 +2,6 @@ package resources import ( "cloud.o-forge.io/core/oc-lib/models/common/pricing" - "cloud.o-forge.io/core/oc-lib/models/resources/resource_model" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/tools" ) @@ -14,13 +13,13 @@ type ResourceInterface interface { GetType() string GetSelectedInstance() utils.DBObject SetAllowedInstances(request *tools.APIRequest) - SetResourceModel(model *resource_model.ResourceModel) } type ResourceInstanceITF interface { utils.DBObject GetID() string GetName() string + StoreDraftDefault() GetPricingsProfiles(peerID string, groups []string) []pricing.PricingProfileITF GetPeerGroups() ([]ResourcePartnerITF, []map[string][]string) ClearPeerGroups() diff --git a/models/resources/processing.go b/models/resources/processing.go index 3885484..da26eb6 100644 --- a/models/resources/processing.go +++ b/models/resources/processing.go @@ -25,20 +25,28 @@ type ProcessingUsage struct { * it defines the resource processing */ type ProcessingResource struct { - AbstractIntanciatedResource[*ResourceInstance[*ResourcePartnerShip[*ProcessingResourcePricingProfile]]] + AbstractIntanciatedResource[*ProcessingInstance] Infrastructure enum.InfrastructureType `json:"infrastructure" bson:"infrastructure" default:"-1"` // Infrastructure is the infrastructure IsService bool `json:"is_service,omitempty" bson:"is_service,omitempty"` // IsService is a flag that indicates if the processing is a service Usage *ProcessingUsage `bson:"usage,omitempty" json:"usage,omitempty"` // Usage is the usage of the processing OpenSource bool `json:"open_source" bson:"open_source" default:"false"` License string `json:"license,omitempty" bson:"license,omitempty"` Maturity string `json:"maturity,omitempty" bson:"maturity,omitempty"` - Container *models.Container `json:"container,omitempty" bson:"container,omitempty"` // Container is the container } func (r *ProcessingResource) GetType() string { return tools.PROCESSING_RESOURCE.String() } +type ProcessingResourceAccess struct { + Container *models.Container `json:"container,omitempty" bson:"container,omitempty"` // Container is the container +} + +type ProcessingInstance struct { + ResourceInstance[*ResourcePartnerShip[*ProcessingResourcePricingProfile]] + Access *ProcessingResourceAccess `json:"access,omitempty" bson:"access,omitempty"` // Access is the access +} + type PricedProcessingResource struct { PricedResource IsService bool diff --git a/models/resources/resource.go b/models/resources/resource.go index 311b271..8d757a7 100644 --- a/models/resources/resource.go +++ b/models/resources/resource.go @@ -7,32 +7,21 @@ import ( "cloud.o-forge.io/core/oc-lib/models/common/models" "cloud.o-forge.io/core/oc-lib/models/common/pricing" "cloud.o-forge.io/core/oc-lib/models/peer" - "cloud.o-forge.io/core/oc-lib/models/resources/resource_model" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/tools" "github.com/biter777/countries" ) // AbstractResource is the struct containing all of the attributes commons to all ressources - -// Resource is the interface to be implemented by all classes inheriting from Resource to have the same behavior - -// http://www.inanzzz.com/index.php/post/wqbs/a-basic-usage-of-int-and-string-enum-types-in-golang -/* -* AbstractResource is a struct that represents a resource -* it defines the resource data - */ - type AbstractResource struct { - utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name) - Type string `json:"type,omitempty" bson:"type,omitempty"` // Type is the type of the resource - Logo string `json:"logo,omitempty" bson:"logo,omitempty" validate:"required"` // Logo is the logo of the resource - Description string `json:"description,omitempty" bson:"description,omitempty"` // Description is the description of the resource - ShortDescription string `json:"short_description,omitempty" bson:"short_description,omitempty" validate:"required"` // ShortDescription is the short description of the resource - Owners []utils.Owner `json:"owners,omitempty" bson:"owners,omitempty"` // Owners is the list of owners of the resource - ResourceModel *resource_model.ResourceModel `json:"resource_model,omitempty" bson:"resource_model,omitempty"` // ResourceModel is the model of the resource - UsageRestrictions string `bson:"usage_restrictions,omitempty" json:"usage_restrictions,omitempty"` - SelectedInstanceIndex *int `json:"selected_instance_index,omitempty" bson:"selected_instance_index,omitempty"` // SelectedInstance is the selected instance + utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name) + Type string `json:"type,omitempty" bson:"type,omitempty"` // Type is the type of the resource + Logo string `json:"logo,omitempty" bson:"logo,omitempty" validate:"required"` // Logo is the logo of the resource + Description string `json:"description,omitempty" bson:"description,omitempty"` // Description is the description of the resource + ShortDescription string `json:"short_description,omitempty" bson:"short_description,omitempty" validate:"required"` // ShortDescription is the short description of the resource + Owners []utils.Owner `json:"owners,omitempty" bson:"owners,omitempty"` // Owners is the list of owners of the resource + UsageRestrictions string `bson:"usage_restrictions,omitempty" json:"usage_restrictions,omitempty"` + SelectedInstanceIndex *int `json:"selected_instance_index,omitempty" bson:"selected_instance_index,omitempty"` // SelectedInstance is the selected instance } func (r *AbstractResource) GetSelectedInstance() utils.DBObject { @@ -58,10 +47,6 @@ func (r *AbstractResource) CanDelete() bool { return r.IsDraft // only draft bookings can be deleted } -func (abs *AbstractResource) SetResourceModel(model *resource_model.ResourceModel) { - abs.ResourceModel = model -} - type AbstractIntanciatedResource[T ResourceInstanceITF] struct { AbstractResource // AbstractResource contains the basic fields of an object (id, name) Instances []T `json:"instances,omitempty" bson:"instances,omitempty"` // Bill is the bill of the resource // Bill is the bill of the resource @@ -145,23 +130,11 @@ type ResourceInstance[T ResourcePartnerITF] struct { Country countries.CountryCode `json:"country,omitempty" bson:"country,omitempty"` AccessProtocol string `json:"access_protocol,omitempty" bson:"access_protocol,omitempty"` Env []models.Param `json:"env,omitempty" bson:"env,omitempty"` - Inputs []models.InOutputs `json:"inputs,omitempty" bson:"inputs,omitempty"` - Outputs []models.InOutputs `json:"outputs,omitempty" bson:"outputs,omitempty"` + Inputs []models.Param `json:"inputs,omitempty" bson:"inputs,omitempty"` + Outputs []models.Param `json:"outputs,omitempty" bson:"outputs,omitempty"` Partnerships []T `json:"partnerships,omitempty" bson:"partnerships,omitempty"` } -func (ri *ResourceInstance[T]) GetAccessor(request *tools.APIRequest) utils.Accessor { - return nil -} - -func (ri *ResourceInstance[T]) GetID() string { - return ri.UUID -} - -func (ri *ResourceInstance[T]) GetName() string { - return ri.Name -} - func (ri *ResourceInstance[T]) GetPricingsProfiles(peerID string, groups []string) []pricing.PricingProfileITF { pricings := []pricing.PricingProfileITF{} for _, p := range ri.Partnerships { diff --git a/models/resources/resource_accessor.go b/models/resources/resource_accessor.go index 4496d77..736cd3f 100644 --- a/models/resources/resource_accessor.go +++ b/models/resources/resource_accessor.go @@ -5,7 +5,6 @@ import ( "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/logs" - "cloud.o-forge.io/core/oc-lib/models/resources/resource_model" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/tools" ) @@ -22,10 +21,9 @@ func NewAccessor[T ResourceInterface](t tools.DataType, request *tools.APIReques } return &resourceMongoAccessor[T]{ AbstractAccessor: utils.AbstractAccessor{ - ResourceModelAccessor: resource_model.NewAccessor(), - Logger: logs.CreateLogger(t.String()), // Create a logger with the data type - Request: request, - Type: t, + Logger: logs.CreateLogger(t.String()), // Create a logger with the data type + Request: request, + Type: t, }, generateData: g, } @@ -39,13 +37,11 @@ func (dca *resourceMongoAccessor[T]) DeleteOne(id string) (utils.DBObject, int, } func (dca *resourceMongoAccessor[T]) UpdateOne(set utils.DBObject, id string) (utils.DBObject, int, error) { - set.(T).SetResourceModel(nil) set.(T).Trim() return utils.GenericUpdateOne(set, id, dca, dca.generateData()) } func (dca *resourceMongoAccessor[T]) StoreOne(data utils.DBObject) (utils.DBObject, int, error) { - data.(T).SetResourceModel(nil) data.(T).Trim() return utils.GenericStoreOne(data, dca) } @@ -56,34 +52,22 @@ func (dca *resourceMongoAccessor[T]) CopyOne(data utils.DBObject) (utils.DBObjec func (dca *resourceMongoAccessor[T]) LoadOne(id string) (utils.DBObject, int, error) { return utils.GenericLoadOne[T](id, func(d utils.DBObject) (utils.DBObject, int, error) { - resources, _, err := dca.ResourceModelAccessor.Search(nil, dca.GetType().String(), false) - if err == nil && len(resources) > 0 { - d.(T).SetResourceModel(resources[0].(*resource_model.ResourceModel)) - } d.(T).SetAllowedInstances(dca.Request) return d, 200, nil }, dca) } func (wfa *resourceMongoAccessor[T]) LoadAll(isDraft bool) ([]utils.ShallowDBObject, int, error) { - resources, _, err := wfa.ResourceModelAccessor.Search(nil, wfa.GetType().String(), isDraft) return utils.GenericLoadAll[T](func(d utils.DBObject) utils.ShallowDBObject { d.(T).SetAllowedInstances(wfa.Request) - if err == nil && len(resources) > 0 { - d.(T).SetResourceModel(resources[0].(*resource_model.ResourceModel)) - } return d }, isDraft, wfa) } func (wfa *resourceMongoAccessor[T]) Search(filters *dbs.Filters, search string, isDraft bool) ([]utils.ShallowDBObject, int, error) { - resources, _, err := wfa.ResourceModelAccessor.Search(nil, wfa.GetType().String(), false) return utils.GenericSearch[T](filters, search, wfa.getResourceFilter(search), func(d utils.DBObject) utils.ShallowDBObject { d.(T).SetAllowedInstances(wfa.Request) - if err == nil && len(resources) > 0 { - d.(T).SetResourceModel(resources[0].(*resource_model.ResourceModel)) - } return d }, isDraft, wfa) } diff --git a/models/resources/resource_model/resource_model.go b/models/resources/resource_model/resource_model.go deleted file mode 100644 index 1794937..0000000 --- a/models/resources/resource_model/resource_model.go +++ /dev/null @@ -1,64 +0,0 @@ -package resource_model - -import ( - "encoding/json" - - "cloud.o-forge.io/core/oc-lib/models/common/models" - "cloud.o-forge.io/core/oc-lib/models/utils" - "cloud.o-forge.io/core/oc-lib/tools" -) - -type Model struct { - Type string `json:"type,omitempty" bson:"type,omitempty"` // Type is the type of the model - ReadOnly bool `json:"readonly,omitempty" bson:"readonly,omitempty"` // ReadOnly is the readonly of the model -} - -/* -* ResourceModel is a struct that represents a resource model -* it defines the resource metadata and specificity -* Warning: This struct is not user available, it is only used by the system - */ -type ResourceModel struct { - utils.AbstractObject - ResourceType string `json:"resource_type,omitempty" bson:"resource_type,omitempty" validate:"required"` - Model map[string]map[string]Model `json:"model,omitempty" bson:"model,omitempty"` - Inputs []models.Param `json:"inputs,omitempty" bson:"inputs,omitempty"` - Outputs []models.Param `json:"outputs,omitempty" bson:"outputs,omitempty"` -} - -func (d *ResourceModel) StoreDraftDefault() { - d.Name = d.ResourceType + " Resource Model" - d.IsDraft = false -} - -func (abs *ResourceModel) VerifyAuth(request *tools.APIRequest) bool { - return true -} - -func (d *ResourceModel) GetAccessor(request *tools.APIRequest) utils.Accessor { - return &ResourceModelMongoAccessor{ - utils.AbstractAccessor{ - Type: tools.RESOURCE_MODEL, - Request: request, - }, - } -} - -func (dma *ResourceModel) Deserialize(j map[string]interface{}, obj utils.DBObject) utils.DBObject { - b, err := json.Marshal(j) - if err != nil { - return nil - } - json.Unmarshal(b, obj) - return obj -} - -func (dma *ResourceModel) Serialize(obj utils.DBObject) map[string]interface{} { - var m map[string]interface{} - b, err := json.Marshal(obj) - if err != nil { - return nil - } - json.Unmarshal(b, &m) - return m -} diff --git a/models/resources/resource_model/resource_model_mongo_accessor.go b/models/resources/resource_model/resource_model_mongo_accessor.go deleted file mode 100644 index f0186de..0000000 --- a/models/resources/resource_model/resource_model_mongo_accessor.go +++ /dev/null @@ -1,62 +0,0 @@ -package resource_model - -import ( - "cloud.o-forge.io/core/oc-lib/dbs" - "cloud.o-forge.io/core/oc-lib/logs" - "cloud.o-forge.io/core/oc-lib/models/utils" - "cloud.o-forge.io/core/oc-lib/tools" -) - -type ResourceModelMongoAccessor struct { - utils.AbstractAccessor // AbstractAccessor contains the basic fields of an accessor (model, caller) -} - -/* -* Nothing special here, just the basic CRUD operations - */ - -func NewAccessor() *ResourceModelMongoAccessor { - return &ResourceModelMongoAccessor{ - utils.AbstractAccessor{ - Type: tools.RESOURCE_MODEL, - Logger: logs.CreateLogger(tools.RESOURCE_MODEL.String()), - }, - } -} - -func (wfa *ResourceModelMongoAccessor) DeleteOne(id string) (utils.DBObject, int, error) { - return utils.GenericDeleteOne(id, wfa) -} - -func (wfa *ResourceModelMongoAccessor) UpdateOne(set utils.DBObject, id string) (utils.DBObject, int, error) { - return utils.GenericUpdateOne(set, id, wfa, &ResourceModel{}) -} - -func (wfa *ResourceModelMongoAccessor) StoreOne(data utils.DBObject) (utils.DBObject, int, error) { - return utils.GenericStoreOne(data, wfa) -} - -func (wfa *ResourceModelMongoAccessor) CopyOne(data utils.DBObject) (utils.DBObject, int, error) { - return utils.GenericStoreOne(data, wfa) -} - -func (a *ResourceModelMongoAccessor) LoadOne(id string) (utils.DBObject, int, error) { - return utils.GenericLoadOne[*ResourceModel](id, func(d utils.DBObject) (utils.DBObject, int, error) { - return d, 200, nil - }, a) -} - -func (a *ResourceModelMongoAccessor) LoadAll(isDraft bool) ([]utils.ShallowDBObject, int, error) { - return utils.GenericLoadAll[*ResourceModel](func(d utils.DBObject) utils.ShallowDBObject { - return d - }, isDraft, a) -} - -func (a *ResourceModelMongoAccessor) Search(filters *dbs.Filters, search string, isDraft bool) ([]utils.ShallowDBObject, int, error) { - return utils.GenericSearch[*ResourceModel](filters, search, - &dbs.Filters{ - Or: map[string][]dbs.Filter{ - "resource_type": {{Operator: dbs.LIKE.String(), Value: search}}, - }, - }, func(d utils.DBObject) utils.ShallowDBObject { return d }, isDraft, a) -} diff --git a/models/utils/abstracts.go b/models/utils/abstracts.go index 29d5419..07a5195 100644 --- a/models/utils/abstracts.go +++ b/models/utils/abstracts.go @@ -37,6 +37,10 @@ type AbstractObject struct { AccessMode AccessMode `json:"access_mode" bson:"access_mode" default:"0"` } +func (ri *AbstractObject) GetAccessor(request *tools.APIRequest) Accessor { + return nil +} + func (r *AbstractObject) GenerateID() { if r.UUID == "" { r.UUID = uuid.New().String()