X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=pkg%2Fsbi%2Fnngpush.go;h=4f5675396954ba50c70a9759ad778dd59e82ed04;hb=b47d12de30e72b6e1017c93ca487279b09038e00;hp=01bde0ce1ff99302693e7a1d673349f4d16b09f6;hpb=16d84d6f7d3489e65e0a83ba9c0d5d62c3914c7f;p=ric-plt%2Frtmgr.git diff --git a/pkg/sbi/nngpush.go b/pkg/sbi/nngpush.go index 01bde0c..4f56753 100644 --- a/pkg/sbi/nngpush.go +++ b/pkg/sbi/nngpush.go @@ -14,6 +14,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + This source code is part of the near-RT RIC (RAN Intelligent Controller) + platform project (RICP). + ================================================================================== */ /* @@ -29,89 +33,120 @@ import ( "nanomsg.org/go/mangos/v2" "nanomsg.org/go/mangos/v2/protocol/push" _ "nanomsg.org/go/mangos/v2/transport/all" - "rtmgr" + "routing-manager/pkg/rtmgr" "strconv" ) -func openNngPush(ip string) error { - return nil +type NngPush struct { + Sbi + NewSocket CreateNewNngSocketHandler } -func closeNngPush() error { - return nil +func NewNngPush() *NngPush { + instance := new(NngPush) + instance.NewSocket = createNewPushSocket + return instance } -func createNngPushEndpointSocket(ep *rtmgr.Endpoint) error { - rtmgr.Logger.Debug("Invoked sbi.createNngPushEndpointSocket") - rtmgr.Logger.Debug("args: %v", (*ep)) - s, err := push.NewSocket() +func createNewPushSocket() (NngSocket, error) { + rtmgr.Logger.Debug("Invoked: createNewPushSocket()") + socket, err := push.NewSocket() if err != nil { - return errors.New("can't open push socket for endpoint: " + ep.Name +" due to:" + err.Error()) + return nil, errors.New("can't create new push socket due to:" + err.Error()) } - s.SetPipeEventHook(pipeEventHandler) - ep.Socket = s - dial(ep) - return nil -} - -func destroyNngPushEndpointSocket(ep *rtmgr.Endpoint) error { - rtmgr.Logger.Debug("Invoked sbi.destroyNngPushEndpointSocket") - rtmgr.Logger.Debug("args: %v", (*ep)) - if err:= ep.Socket.(mangos.Socket).Close(); err != nil { - return errors.New("can't close push socket of endpoint:" + ep.Uuid + " due to:" + err.Error()) - } - return nil + socket.SetPipeEventHook(pipeEventHandler) + return socket, nil } func pipeEventHandler(event mangos.PipeEvent, pipe mangos.Pipe) { + rtmgr.Logger.Debug("Invoked: pipeEventHandler()") + rtmgr.Logger.Debug("Received pipe event for " + pipe.Address() + " address") for _, ep := range rtmgr.Eps { - uri := DEFAULT_NNG_PIPELINE_SOCKET_PREFIX + ep.Ip + ":" + strconv.Itoa(DEFAULT_NNG_PIPELINE_SOCKET_NUMBER) + uri := DefaultNngPipelineSocketPrefix + ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) if uri == pipe.Address() { switch event { case 1: ep.IsReady = true - rtmgr.Logger.Debug("Endpoint " + uri + " successfully registered") + rtmgr.Logger.Debug("Endpoint " + uri + " successfully attached") default: ep.IsReady = false - rtmgr.Logger.Debug("Endpoint " + uri + " has been deregistered") + rtmgr.Logger.Debug("Endpoint " + uri + " has been detached") } - } + } + } +} + +func (c *NngPush) Initialize(ip string) error { + return nil +} + +func (c *NngPush) Terminate() error { + return nil +} + +func (c *NngPush) AddEndpoint(ep *rtmgr.Endpoint) error { + var err error + var socket NngSocket + rtmgr.Logger.Debug("Invoked sbi.AddEndpoint") + rtmgr.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()) } + return nil +} + +func (c *NngPush) DeleteEndpoint(ep *rtmgr.Endpoint) error { + rtmgr.Logger.Debug("Invoked sbi. DeleteEndpoint") + rtmgr.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()) + } + return nil +} + +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 dial(ep *rtmgr.Endpoint) { +func (c *NngPush) dial(ep *rtmgr.Endpoint) error { rtmgr.Logger.Debug("Dialing to endpoint: " + ep.Uuid) - uri := DEFAULT_NNG_PIPELINE_SOCKET_PREFIX + ep.Ip + ":" + strconv.Itoa(DEFAULT_NNG_PIPELINE_SOCKET_NUMBER) + uri := DefaultNngPipelineSocketPrefix + ep.Ip + ":" + strconv.Itoa(DefaultNngPipelineSocketNumber) options := make(map[string]interface{}) options[mangos.OptionDialAsynch] = true - if err := ep.Socket.(mangos.Socket).DialOptions(uri, options); err != nil { - rtmgr.Logger.Error("can't dial on push socket to " + uri + " due to:" + err.Error()) + 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 pushAll(policies *[]string) error { - rtmgr.Logger.Debug("Invoked: sbi.pushAll") - rtmgr.Logger.Debug("args: %v", (*policies)) +func (c *NngPush) DistributeAll(policies *[]string) error { + rtmgr.Logger.Debug("Invoked: sbi.DistributeAll") + rtmgr.Logger.Debug("args: %v", *policies) for _, ep := range rtmgr.Eps { if ep.IsReady { - go send(ep, policies) + go c.send(ep, policies) } else { - rtmgr.Logger.Warn("Endpoint " + ep.Uuid + "is not ready") + rtmgr.Logger.Warn("Endpoint " + ep.Uuid + " is not ready") } } return nil } -func send(ep *rtmgr.Endpoint, policies *[]string) { - rtmgr.Logger.Debug("Invoked: sbi.pushAll") - rtmgr.Logger.Debug("Push policy to endpoint: "+ ep.Uuid) +func (c *NngPush) send(ep *rtmgr.Endpoint, policies *[]string) { + rtmgr.Logger.Debug("Push policy to endpoint: " + ep.Uuid) for _, pe := range *policies { - if err := ep.Socket.(mangos.Socket).Send([]byte(pe)); err != nil { + if err := ep.Socket.(NngSocket).Send([]byte(pe)); err != nil { rtmgr.Logger.Error("Unable to send policy entry due to: " + err.Error()) } } - rtmgr.Logger.Info("NNG PUSH to ednpoint " + ep.Uuid + ": OK (# of Entries:" + strconv.Itoa(len((*policies))) + ")") + rtmgr.Logger.Info("NNG PUSH to endpoint " + ep.Uuid + ": OK (# of Entries:" + strconv.Itoa(len(*policies)) + ")") }