oc-discovery -> conf
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
|
||||
oclib "cloud.o-forge.io/core/oc-lib"
|
||||
"cloud.o-forge.io/core/oc-lib/config"
|
||||
pp_model "cloud.o-forge.io/core/oc-lib/models/peer"
|
||||
"cloud.o-forge.io/core/oc-lib/tools"
|
||||
pp "github.com/libp2p/go-libp2p/core/peer"
|
||||
"github.com/libp2p/go-libp2p/core/protocol"
|
||||
@@ -25,8 +26,10 @@ type executionConsidersPayload struct {
|
||||
|
||||
func ListenNATS(n *Node) {
|
||||
tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){
|
||||
tools.PEER_BEHAVIOR_EVENT: func(resp tools.NATSResponse) { //nolint:typecheck
|
||||
handlePeerBehaviorEvent(n, resp)
|
||||
},
|
||||
tools.PROPALGATION_EVENT: func(resp tools.NATSResponse) {
|
||||
fmt.Println("PROPALGATION")
|
||||
if resp.FromApp == config.GetAppName() {
|
||||
return
|
||||
}
|
||||
@@ -41,7 +44,6 @@ func ListenNATS(n *Node) {
|
||||
dtt := tools.DataType(propalgation.DataType)
|
||||
dt = &dtt
|
||||
}
|
||||
fmt.Println("PROPALGATION ACT", propalgation.DataType, propalgation.Action, propalgation.Action == tools.PB_CREATE, err)
|
||||
if err == nil {
|
||||
switch propalgation.Action {
|
||||
case tools.PB_ADMIRALTY_CONFIG, tools.PB_MINIO_CONFIG:
|
||||
@@ -116,6 +118,7 @@ func ListenNATS(n *Node) {
|
||||
}
|
||||
n.StreamService.Mu.Unlock()
|
||||
} else {
|
||||
fmt.Println("REACH PLANNER")
|
||||
n.StreamService.PublishCommon(nil, resp.User, resp.Groups, fmt.Sprintf("%v", m["peer_id"]), stream.ProtocolSendPlanner, b)
|
||||
}
|
||||
}
|
||||
@@ -158,6 +161,8 @@ func ListenNATS(n *Node) {
|
||||
} else {
|
||||
m := map[string]interface{}{}
|
||||
if err := json.Unmarshal(propalgation.Payload, &m); err == nil {
|
||||
fmt.Println("PB_SEARCH CATA", m)
|
||||
|
||||
n.PubSubService.SearchPublishEvent(
|
||||
context.Background(),
|
||||
dt,
|
||||
@@ -172,3 +177,66 @@ func ListenNATS(n *Node) {
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// handlePeerBehaviorEvent applies a PeerBehaviorReport received from a trusted
|
||||
// service (oc-scheduler, oc-datacenter, …). It:
|
||||
// 1. Loads the target peer from the local DB.
|
||||
// 2. Deducts the trust penalty and appends a BehaviorWarning.
|
||||
// 3. Auto-blacklists and evicts the peer stream when TrustScore ≤ threshold.
|
||||
//
|
||||
// oc-discovery does NOT re-emit a PROPALGATION_EVENT: propagation is strictly
|
||||
// inbound (oc-catalog → oc-discovery). The blacklist takes effect locally at
|
||||
// the next isPeerKnown() call, and immediately via EvictPeer().
|
||||
func handlePeerBehaviorEvent(n *Node, resp tools.NATSResponse) {
|
||||
var report tools.PeerBehaviorReport
|
||||
if err := json.Unmarshal(resp.Payload, &report); err != nil {
|
||||
fmt.Println("handlePeerBehaviorEvent: unmarshal error:", err)
|
||||
return
|
||||
}
|
||||
if report.TargetPeerID == "" {
|
||||
return
|
||||
}
|
||||
|
||||
access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
|
||||
data := access.LoadOne(report.TargetPeerID)
|
||||
if data.Data == nil {
|
||||
fmt.Println("handlePeerBehaviorEvent: peer not found:", report.TargetPeerID)
|
||||
return
|
||||
}
|
||||
p := data.ToPeer()
|
||||
if p == nil {
|
||||
return
|
||||
}
|
||||
// Self-protection: never penalise ourselves.
|
||||
if self, err := oclib.GetMySelf(); err == nil && self != nil && self.GetID() == p.GetID() {
|
||||
return
|
||||
}
|
||||
|
||||
shouldBlacklist := p.ApplyBehaviorReport(report)
|
||||
if shouldBlacklist && p.Relation != pp_model.BLACKLIST {
|
||||
p.Relation = pp_model.BLACKLIST
|
||||
fmt.Printf("handlePeerBehaviorEvent: auto-blacklisting peer %s — reason: %s\n",
|
||||
p.PeerID, p.BlacklistReason)
|
||||
// Immediately evict any active stream so the peer can no longer heartbeat.
|
||||
if n.IndexerService != nil {
|
||||
n.IndexerService.EvictPeer(p.PeerID)
|
||||
}
|
||||
}
|
||||
|
||||
// Persist updated trust score + relation locally.
|
||||
if updated := access.UpdateOne(p.Serialize(p), p.GetID()); updated.Err != "" {
|
||||
fmt.Println("handlePeerBehaviorEvent: could not update peer:", updated.Err)
|
||||
return
|
||||
}
|
||||
|
||||
// Notify oc-peer (and any other local NATS consumer) of the updated peer record
|
||||
// via CREATE_RESOURCE so they can synchronise their own state.
|
||||
if b, err := json.Marshal(p.Serialize(p)); err == nil {
|
||||
tools.NewNATSCaller().SetNATSPub(tools.CREATE_RESOURCE, tools.NATSResponse{
|
||||
FromApp: "oc-discovery",
|
||||
Datatype: tools.PEER,
|
||||
Method: int(tools.CREATE_RESOURCE),
|
||||
Payload: b,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user