From 802786daa7023fa0a395eced03640241861aa511 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 26 Jan 2026 16:29:09 +0100 Subject: [PATCH] Peer Manipulation --- entrypoint.go | 8 +++ .../collaborative_area_mongo_accessor.go | 11 +++- models/peer/peer.go | 28 ----------- models/peer/peer_mongo_accessor.go | 10 ++-- models/resources/resource.go | 50 ++++++++++--------- models/utils/common.go | 41 +++++++++++++++ models/workflow/workflow_mongo_accessor.go | 4 +- models/workspace/workspace_mongo_accessor.go | 4 +- 8 files changed, 98 insertions(+), 58 deletions(-) diff --git a/entrypoint.go b/entrypoint.go index a1721cf..396399e 100644 --- a/entrypoint.go +++ b/entrypoint.go @@ -62,6 +62,14 @@ const ( NATIVE_TOOL = tools.NATIVE_TOOL ) +func GetMySelf() (string, error) { + return utils.GetMySelf((&peer.Peer{}).GetAccessor(&tools.APIRequest{Admin: true})) +} + +func IsMySelf(peerID string) (bool, string) { + return utils.IsMySelf(peerID, (&peer.Peer{}).GetAccessor(&tools.APIRequest{Admin: true})) +} + func GenerateNodeID() (string, error) { folderStatic := "/var/lib/opencloud-node" if _, err := os.Stat(folderStatic); err == nil { diff --git a/models/collaborative_area/collaborative_area_mongo_accessor.go b/models/collaborative_area/collaborative_area_mongo_accessor.go index 54d9301..67c882f 100644 --- a/models/collaborative_area/collaborative_area_mongo_accessor.go +++ b/models/collaborative_area/collaborative_area_mongo_accessor.go @@ -63,7 +63,12 @@ func (a *collaborativeAreaMongoAccessor) UpdateOne(set utils.DBObject, id string // StoreOne stores a collaborative area in the database, it automatically share to peers if the workspace is shared func (a *collaborativeAreaMongoAccessor) StoreOne(data utils.DBObject) (utils.DBObject, int, error) { - _, id := (&peer.Peer{}).IsMySelf() // get the local peer + id, err := utils.GetMySelf((&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })) // get the local peer + if err != nil { + return data, 404, err + } data.(*CollaborativeArea).Clear(id) // set the creator // retrieve or proper peer if data.(*CollaborativeArea).CollaborativeAreaRule != nil { @@ -271,7 +276,9 @@ func (a *collaborativeAreaMongoAccessor) contactPeer(shared *CollaborativeArea, paccess := (&peer.Peer{}) for k := range shared.AllowedPeersGroup { - if ok, _ := (&peer.Peer{AbstractObject: utils.AbstractObject{UUID: k}}).IsMySelf(); ok || (shared.IsSent && meth == tools.POST) || (!shared.IsSent && meth != tools.POST) { + if ok, _ := utils.IsMySelf(k, (&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok || (shared.IsSent && meth == tools.POST) || (!shared.IsSent && meth != tools.POST) { continue } shared.IsSent = meth == tools.POST diff --git a/models/peer/peer.go b/models/peer/peer.go index 83a0d31..745f168 100644 --- a/models/peer/peer.go +++ b/models/peer/peer.go @@ -57,24 +57,6 @@ func (m PeerRelation) EnumIndex() int { return int(m) } -func GetSelf() (utils.ShallowDBObject, string) { - d, code, err := NewAccessor(nil).Search(nil, SELF.String(), false) - if code != 200 || err != nil || len(d) == 0 { - return nil, "" - } - id := d[0].GetID() - return d[0], id -} - -func IsMySelf(peerID string) (bool, string) { - d, code, err := NewAccessor(nil).Search(nil, SELF.String(), false) - if code != 200 || err != nil || len(d) == 0 { - return false, "" - } - id := d[0].GetID() - return peerID == id, id -} - // Peer is a struct that represents a peer type Peer struct { utils.AbstractObject @@ -120,16 +102,6 @@ func (ao *Peer) RemoveExecution(exec PeerExecution) { ao.FailedExecution = new } -// IsMySelf checks if the peer is the local peer -func (p *Peer) IsMySelf() (bool, string) { - d, code, err := NewAccessor(nil).Search(nil, SELF.String(), p.IsDraft) - if code != 200 || err != nil || len(d) == 0 { - return false, "" - } - id := d[0].GetID() - return p.UUID == id, id -} - // LaunchPeerExecution launches an execution on a peer func (p *Peer) LaunchPeerExecution(peerID string, dataID string, dt tools.DataType, method tools.METHOD, body interface{}, caller *tools.HTTPCaller) (map[string]interface{}, error) { p.UUID = peerID diff --git a/models/peer/peer_mongo_accessor.go b/models/peer/peer_mongo_accessor.go index 0c6f598..3eda04b 100644 --- a/models/peer/peer_mongo_accessor.go +++ b/models/peer/peer_mongo_accessor.go @@ -80,10 +80,14 @@ func (wfa *peerMongoAccessor) Search(filters *dbs.Filters, search string, isDraf } func (a *peerMongoAccessor) GetDefaultFilter(search string) *dbs.Filters { if i, err := strconv.Atoi(search); err == nil { + m := map[string][]dbs.Filter{ // search by name if no filters are provided + "relation": {{Operator: dbs.EQUAL.String(), Value: i}}, + } + if i == PARTNER.EnumIndex() { + m["verify"] = []dbs.Filter{{Operator: dbs.EQUAL.String(), Value: false}} + } return &dbs.Filters{ - Or: map[string][]dbs.Filter{ // search by name if no filters are provided - "relation": {{Operator: dbs.EQUAL.String(), Value: i}}, - }, + Or: m, } } else { if search == "*" { diff --git a/models/resources/resource.go b/models/resources/resource.go index 0cdc4a1..25ff9ad 100755 --- a/models/resources/resource.go +++ b/models/resources/resource.go @@ -86,22 +86,6 @@ func (abs *AbstractInstanciatedResource[T]) RefineResourceByPartnership(peerID s return abs } -func (abs *AbstractInstanciatedResource[T]) FilterPeer(peerID string) *dbs.Filters { - return &dbs.Filters{ - And: map[string][]dbs.Filter{ - "instances": {{Operator: dbs.ELEMMATCH.String(), Value: &dbs.Filters{ - And: map[string][]dbs.Filter{ - "partnerships": {{Operator: dbs.ELEMMATCH.String(), Value: &dbs.Filters{ - And: map[string][]dbs.Filter{ - "peer_groups." + peerID: {{Operator: dbs.EXISTS.String(), Value: true}}, - }, - }}}, - }, - }}}, - }, - } -} - func (abs *AbstractInstanciatedResource[T]) AddInstances(instance ResourceInstanceITF) { abs.Instances = append(abs.Instances, instance.(T)) } @@ -121,7 +105,9 @@ func (abs *AbstractInstanciatedResource[T]) ConvertToPricedResource(t tools.Data if len(profiles) > 0 { profile = profiles[0] } else { - if ok, _ := peer.IsMySelf(request.PeerID); ok { + if ok, _ := utils.IsMySelf(request.PeerID, (&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok { profile = pricing.GetDefaultPricingProfile() } else { return nil, errors.New("no pricing profile found") @@ -171,7 +157,9 @@ func (abs *AbstractInstanciatedResource[T]) SetAllowedInstances(request *tools.A func (d *AbstractInstanciatedResource[T]) Trim() { d.Type = d.GetType() - if ok, _ := (&peer.Peer{AbstractObject: utils.AbstractObject{UUID: d.CreatorID}}).IsMySelf(); !ok { + if ok, _ := utils.IsMySelf(d.CreatorID, (&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })); !ok { for _, instance := range d.Instances { instance.ClearPeerGroups() } @@ -259,7 +247,9 @@ func (ri *ResourceInstance[T]) GetProfile(peerID string, partnershipIndex *int, prts := ri.Partnerships[*partnershipIndex] return prts.GetProfile(buyingIndex, strategyIndex) } - if ok, _ := peer.IsMySelf(peerID); ok { + if ok, _ := utils.IsMySelf(peerID, (&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok { return pricing.GetDefaultPricingProfile() } return nil @@ -271,7 +261,9 @@ func (ri *ResourceInstance[T]) GetPricingsProfiles(peerID string, groups []strin pricings = append(pricings, p.GetPricingsProfiles(peerID, groups)...) } if len(pricings) == 0 { - if ok, _ := peer.IsMySelf(peerID); ok { + if ok, _ := utils.IsMySelf(peerID, (&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok { pricings = append(pricings, pricing.GetDefaultPricingProfile()) } } @@ -286,7 +278,12 @@ func (ri *ResourceInstance[T]) GetPeerGroups() ([]ResourcePartnerITF, []map[stri groups = append(groups, p.GetPeerGroups()) } if len(groups) == 0 { - _, id := peer.GetSelf() + id, err := utils.GetMySelf((&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })) + if err != nil { + return partners, groups + } groups = []map[string][]string{ { id: {"*"}, @@ -358,7 +355,9 @@ func (ri *ResourcePartnerShip[T]) GetPricingsProfiles(peerID string, groups []st } } if len(profiles) == 0 { - if ok, _ := peer.IsMySelf(peerID); ok { + if ok, _ := utils.IsMySelf(peerID, (&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok { profiles = append(profiles, pricing.GetDefaultPricingProfile()) } } @@ -367,7 +366,12 @@ func (ri *ResourcePartnerShip[T]) GetPricingsProfiles(peerID string, groups []st func (rp *ResourcePartnerShip[T]) GetPeerGroups() map[string][]string { if len(rp.PeerGroups) == 0 { - _, id := peer.GetSelf() + id, err := utils.GetMySelf((&peer.Peer{}).GetAccessor(&tools.APIRequest{ + Admin: true, + })) + if err != nil { + return rp.PeerGroups + } return map[string][]string{ id: {"*"}, } diff --git a/models/utils/common.go b/models/utils/common.go index 120e73b..c8bd25a 100755 --- a/models/utils/common.go +++ b/models/utils/common.go @@ -2,9 +2,11 @@ package utils import ( "errors" + "os" "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/dbs/mongo" + "github.com/google/uuid" mgb "go.mongodb.org/mongo-driver/mongo" ) @@ -164,3 +166,42 @@ func GenericRawUpdateOne(set DBObject, id string, a Accessor) (DBObject, int, er } return a.LoadOne(id) } + +func GetMySelf(wfa Accessor) (string, error) { + id, err := GenerateNodeID() + if err != nil { + return "", err + } + datas, _, _ := wfa.Search(nil, id, false) + if len(datas) > 0 { + return datas[0].GetID(), nil + } + return "", errors.New("peer not found") +} + +func IsMySelf(peerID string, wfa Accessor) (bool, string) { + id, err := GetMySelf(wfa) + if err != nil { + return false, "" + } + return peerID == id, id +} + +func GenerateNodeID() (string, error) { + folderStatic := "/var/lib/opencloud-node" + if _, err := os.Stat(folderStatic); err == nil { + os.MkdirAll(folderStatic, 0644) + } + folderStatic += "/node_id" + if _, err := os.Stat(folderStatic); os.IsNotExist(err) { + hostname, err := os.Hostname() + if err != nil { + return "", err + } + id := uuid.NewSHA1(uuid.NameSpaceOID, []byte("oc-"+hostname)) + err = os.WriteFile(folderStatic, []byte(id.String()), 0644) + return id.String(), err + } + data, err := os.ReadFile(folderStatic) + return string(data), err +} diff --git a/models/workflow/workflow_mongo_accessor.go b/models/workflow/workflow_mongo_accessor.go index 553acbd..dd94c47 100644 --- a/models/workflow/workflow_mongo_accessor.go +++ b/models/workflow/workflow_mongo_accessor.go @@ -68,7 +68,9 @@ func (a *workflowMongoAccessor) share(realData *Workflow, delete bool, caller *t paccess := &peer.Peer{} for _, p := range res.(*shallow_collaborative_area.ShallowCollaborativeArea).Peers { paccess.UUID = p - if ok, _ := paccess.IsMySelf(); ok { // if the peer is the current peer, never share because it will create a loop + if ok, _ := utils.IsMySelf(p, paccess.GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok { // if the peer is the current peer, never share because it will create a loop continue } if delete { // if the workflow is deleted, share the deletion orderResourceAccessor utils.Accessor diff --git a/models/workspace/workspace_mongo_accessor.go b/models/workspace/workspace_mongo_accessor.go index 7711f00..35034c0 100644 --- a/models/workspace/workspace_mongo_accessor.go +++ b/models/workspace/workspace_mongo_accessor.go @@ -130,7 +130,9 @@ func (a *workspaceMongoAccessor) share(realData *Workspace, method tools.METHOD, paccess := &peer.Peer{} for _, p := range res.(*shallow_collaborative_area.ShallowCollaborativeArea).Peers { paccess.UUID = p - if ok, _ := paccess.IsMySelf(); ok { // If the peer is the current peer, never share because it will create a loop + if ok, _ := utils.IsMySelf(p, paccess.GetAccessor(&tools.APIRequest{ + Admin: true, + })); ok { // If the peer is the current peer, never share because it will create a loop continue } if method == tools.DELETE { // If the workspace is deleted, share the deletion