diff --git a/entrypoint.go b/entrypoint.go index 8339b41..cb83d75 100644 --- a/entrypoint.go +++ b/entrypoint.go @@ -17,6 +17,7 @@ import ( "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/compute_units" "cloud.o-forge.io/core/oc-lib/models/order" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/resources" @@ -577,3 +578,10 @@ func (l *LibData) ToOrder() *order.Order { } return nil } + +func (l *LibData) ToComputeUnits() *compute_units.ComputeUnits { + if l.Data.GetAccessor(nil).GetType() == tools.COMPUTE_UNITS { + return l.Data.(*compute_units.ComputeUnits) + } + return nil +} diff --git a/models/compute_units/compute_units_mongo_accessor.go b/models/compute_units/compute_units_mongo_accessor.go index 0922c10..137c6b1 100644 --- a/models/compute_units/compute_units_mongo_accessor.go +++ b/models/compute_units/compute_units_mongo_accessor.go @@ -34,6 +34,7 @@ func (a *computeUnitsMongoAccessor) DeleteOne(id string) (utils.DBObject, int, e } func (a *computeUnitsMongoAccessor) UpdateOne(set utils.DBObject, id string) (utils.DBObject, int, error) { + // should verify if a source is existing... return utils.GenericUpdateOne(set, id, a, &ComputeUnits{}) } @@ -47,6 +48,14 @@ func (a *computeUnitsMongoAccessor) CopyOne(data utils.DBObject) (utils.DBObject return nil, 422, errors.New("can't publish a drafted compute units") } computeUnits := data.(*ComputeUnits) + if computeUnits.MonitorPath == "" || computeUnits.GetID() != "" { + return nil, 422, errors.New("publishing is only allowed is it can be monitored and be accessible") + } + if res, code, err := a.LoadOne(computeUnits.GetID()); err != nil { + return nil, code, err + } else { + computeUnits = res.(*ComputeUnits) + } resAccess := resources.NewAccessor[*resources.ComputeResource](tools.COMPUTE_RESOURCE, a.Request, func() utils.DBObject { return &resources.ComputeResource{} }) var instance *resources.ComputeResourceInstance b, _ := json.Marshal(computeUnits) @@ -65,11 +74,16 @@ func (a *computeUnitsMongoAccessor) CopyOne(data utils.DBObject) (utils.DBObject existingComputeResource.Instances = append(existingComputeResource.Instances, instance) return resAccess.UpdateOne(existingComputeResource, existingComputeResource.UUID) } else { - var resource *resources.ComputeResource + var r resources.ComputeResource b, _ := json.Marshal(computeUnits) - json.Unmarshal(b, resource) - resource.Instances = append(resource.Instances, instance) - return resAccess.StoreOne(resource) + json.Unmarshal(b, &r) + r.Instances = append(r.Instances, instance) + res, code, err := resAccess.StoreOne(&r) + if err != nil { + return nil, code, err + } + computeUnits.ResourceID = res.GetID() + return a.UpdateOne(computeUnits, computeUnits.GetID()) } } diff --git a/models/resources/resource_accessor.go b/models/resources/resource_accessor.go index 338c0b1..2da6350 100755 --- a/models/resources/resource_accessor.go +++ b/models/resources/resource_accessor.go @@ -1,6 +1,7 @@ package resources import ( + "errors" "slices" "cloud.o-forge.io/core/oc-lib/dbs" @@ -37,16 +38,25 @@ func (dca *ResourceMongoAccessor[T]) DeleteOne(id string) (utils.DBObject, int, } func (dca *ResourceMongoAccessor[T]) UpdateOne(set utils.DBObject, id string) (utils.DBObject, int, error) { + if dca.GetType() == tools.COMPUTE_RESOURCE { + return nil, 404, errors.New("can't update a non existing computing units resource not reported onto compute units catalog") + } set.(T).Trim() return utils.GenericUpdateOne(set, id, dca, dca.generateData()) } func (dca *ResourceMongoAccessor[T]) StoreOne(data utils.DBObject) (utils.DBObject, int, error) { + if dca.GetType() == tools.COMPUTE_RESOURCE { + return nil, 404, errors.New("can't create a non existing computing units resource not reported onto compute units catalog") + } data.(T).Trim() return utils.GenericStoreOne(data, dca) } func (dca *ResourceMongoAccessor[T]) CopyOne(data utils.DBObject) (utils.DBObject, int, error) { + if dca.GetType() == tools.COMPUTE_RESOURCE { + return nil, 404, errors.New("can't copy/publish a non existing computing units resource not reported onto compute units catalog") + } return dca.StoreOne(data) }