X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=pkg%2Fsbi%2Fnngpush.go;h=74e077b66d8f2e98500e39441e290194f6978a52;hb=18c349966e295f6728f3fe0305cf90759a66a73c;hp=b270abfb9cedf0326deb25d2439f8892a3df761b;hpb=0e38e1ba0b4df4e65b60ed45ed9a6638bcda44c1;p=ric-plt%2Frtmgr.git diff --git a/pkg/sbi/nngpush.go b/pkg/sbi/nngpush.go index b270abf..74e077b 100644 --- a/pkg/sbi/nngpush.go +++ b/pkg/sbi/nngpush.go @@ -28,69 +28,36 @@ package sbi -/* -#include -#include -#include -#include -#include -#include - - -#cgo CFLAGS: -I../ -#cgo LDFLAGS: -lrmr_nng -lnng -*/ -import "C" - import ( + "bytes" + "crypto/md5" "errors" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" - "nanomsg.org/go/mangos/v2" - "nanomsg.org/go/mangos/v2/protocol/push" - _ "nanomsg.org/go/mangos/v2/transport/all" "routing-manager/pkg/rtmgr" "strconv" - "time" + //"time" + "fmt" ) type NngPush struct { Sbi - NewSocket CreateNewNngSocketHandler - rcChan chan *xapp.RMRParams + rcChan chan *xapp.RMRParams } -func NewNngPush() *NngPush { - instance := new(NngPush) - instance.NewSocket = createNewPushSocket - return instance +type RMRParams struct { + *xapp.RMRParams } -func createNewPushSocket() (NngSocket, error) { - xapp.Logger.Debug("Invoked: createNewPushSocket()") - socket, err := push.NewSocket() - if err != nil { - return nil, errors.New("can't create new push socket due to:" + err.Error()) - } - socket.SetPipeEventHook(pipeEventHandler) - return socket, nil +func (params *RMRParams) String() string { + var b bytes.Buffer + sum := md5.Sum(params.Payload) + fmt.Fprintf(&b, "params(Src=%s Mtype=%d SubId=%d Xid=%s Meid=%s Paylens=%d/%d Payhash=%x)", params.Src, params.Mtype, params.SubId, params.Xid, params.Meid.RanName, params.PayloadLen, len(params.Payload), sum) + return b.String() } -func pipeEventHandler(event mangos.PipeEvent, pipe mangos.Pipe) { - xapp.Logger.Debug("Invoked: pipeEventHandler()") - xapp.Logger.Debug("Received pipe event for " + pipe.Address() + " address") - for _, ep := range rtmgr.Eps { - uri := DefaultNngPipelineSocketPrefix + ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) - if uri == pipe.Address() { - switch event { - case 1: - ep.IsReady = true - xapp.Logger.Debug("Endpoint " + uri + " successfully attached") - default: - ep.IsReady = false - xapp.Logger.Debug("Endpoint " + uri + " has been detached") - } - } - } +func NewNngPush() *NngPush { + instance := new(NngPush) + return instance } func (c *NngPush) Initialize(ip string) error { @@ -102,28 +69,24 @@ func (c *NngPush) Terminate() error { } func (c *NngPush) AddEndpoint(ep *rtmgr.Endpoint) error { - var err error - var socket NngSocket + xapp.Logger.Debug("Invoked sbi.AddEndpoint") - xapp.Logger.Debug("args: %v", *ep) - socket, err = c.NewSocket() - if err != nil { - return errors.New("can't add new socket to endpoint:" + ep.Uuid + " due to: " + err.Error()) - } - ep.Socket = socket - err = c.dial(ep) - if err != nil { - return errors.New("can't dial to endpoint:" + ep.Uuid + " due to: " + err.Error()) + endpoint := ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) + ep.Whid = int(xapp.Rmr.Openwh(endpoint)) + if ep.Whid < 0 { + return errors.New("can't open warmhole connection for endpoint:" + ep.Uuid + " due to invalid Wormhole ID: " + string(ep.Whid)) + } else { + xapp.Logger.Debug("Wormhole ID is %v and EP is %v", ep.Whid, endpoint) } + return nil } func (c *NngPush) DeleteEndpoint(ep *rtmgr.Endpoint) error { xapp.Logger.Debug("Invoked sbi. DeleteEndpoint") xapp.Logger.Debug("args: %v", *ep) - if err := ep.Socket.(NngSocket).Close(); err != nil { - return errors.New("can't close push socket of endpoint:" + ep.Uuid + " due to: " + err.Error()) - } + + xapp.Rmr.Closewh(ep.Whid) return nil } @@ -131,45 +94,61 @@ func (c *NngPush) UpdateEndpoints(rcs *rtmgr.RicComponents) { c.updateEndpoints(rcs, c) } -/* -NOTE: Asynchronous dial starts a goroutine which keep maintains the connection to the given endpoint -*/ -func (c *NngPush) dial(ep *rtmgr.Endpoint) error { - xapp.Logger.Debug("Dialing to endpoint: " + ep.Uuid) - uri := DefaultNngPipelineSocketPrefix + ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) - options := make(map[string]interface{}) - options[mangos.OptionDialAsynch] = true - if err := ep.Socket.(NngSocket).DialOptions(uri, options); err != nil { - return errors.New("can't dial on push socket to " + uri + " due to: " + err.Error()) - } - return nil -} - func (c *NngPush) DistributeAll(policies *[]string) error { xapp.Logger.Debug("Invoked: sbi.DistributeAll") xapp.Logger.Debug("args: %v", *policies) + for _, ep := range rtmgr.Eps { - i := 1 - for i < 5 { - if ep.IsReady { - go c.send(ep, policies) - break - } else { - xapp.Logger.Warn("Endpoint " + ep.Uuid + " is not ready" + " Retry count " + strconv.Itoa(i)) - time.Sleep(10 * time.Millisecond) - i++ - } - } + go c.send(ep, policies) } + return nil } func (c *NngPush) send(ep *rtmgr.Endpoint, policies *[]string) { xapp.Logger.Debug("Push policy to endpoint: " + ep.Uuid) + + var policy = []byte{} + cumulative_policy := 0 + count := 0 + maxrecord := xapp.Config.GetInt("maxrecord") + if maxrecord == 0 { + maxrecord = 10 + } + for _, pe := range *policies { - if err := ep.Socket.(NngSocket).Send([]byte(pe)); err != nil { - xapp.Logger.Error("Unable to send policy entry due to: " + err.Error()) + b := []byte(pe) + for j := 0; j < len(b); j++ { + policy = append(policy, b[j]) + } + count++ + cumulative_policy++ + if count == maxrecord || cumulative_policy == len(*policies) { + params := &RMRParams{&xapp.RMRParams{}} + params.Mtype = 20 + params.PayloadLen = len(policy) + params.Payload = []byte(policy) + params.Mbuf = nil + params.Whid = ep.Whid + xapp.Rmr.SendMsg(params.RMRParams) + count = 0 + policy = nil + xapp.Logger.Debug("Sent message with payload len = %d to %s", params.PayloadLen, ep.Uuid) } } + xapp.Logger.Info("NNG PUSH to endpoint " + ep.Uuid + ": OK (# of Entries:" + strconv.Itoa(len(*policies)) + ")") } + +func (c *NngPush) CreateEndpoint(payload string) *rtmgr.Endpoint { + return c.createEndpoint(payload, c) +} + +func (c *NngPush) DistributeToEp(policies *[]string, ep *rtmgr.Endpoint) error { + xapp.Logger.Debug("Invoked: sbi.DistributeToEp") + xapp.Logger.Debug("args: %v", *policies) + + go c.send(ep, policies) + + return nil +}