2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
19 This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 platform project (RICP).
22 ==================================================================================
25 Mnemonic: httprestful.go
26 Abstract: HTTP Restful API NBI implementation
27 Based on Swagger generated code
33 //noinspection GoUnresolvedReference,GoUnresolvedReference,GoUnresolvedReference,GoUnresolvedReference,GoUnresolvedReference,GoUnresolvedReference
38 xfmodel "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
39 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
40 "github.com/go-openapi/loads"
41 "github.com/go-openapi/runtime/middleware"
45 "routing-manager/pkg/models"
46 "routing-manager/pkg/restapi"
47 "routing-manager/pkg/restapi/operations"
48 "routing-manager/pkg/restapi/operations/debug"
49 "routing-manager/pkg/restapi/operations/handle"
50 "routing-manager/pkg/rpe"
51 "routing-manager/pkg/rtmgr"
52 "routing-manager/pkg/sdl"
59 type HttpRestful struct {
61 LaunchRest LaunchRestHandler
62 RetrieveStartupData RetrieveStartupDataHandler
65 func NewHttpRestful() *HttpRestful {
66 instance := new(HttpRestful)
67 instance.LaunchRest = launchRest
68 instance.RetrieveStartupData = retrieveStartupData
72 func recvXappCallbackData(xappData *models.XappCallbackData) (*[]rtmgr.XApp, error) {
74 var xapps []rtmgr.XApp
75 err := json.Unmarshal([]byte(xappData.XApps), &xapps)
78 xapp.Logger.Info("No data")
81 xapp.Logger.Debug("Nothing received on the Http interface")
85 func recvNewE2Tdata(e2tData *models.E2tData) (*rtmgr.E2TInstance, string, error) {
87 xapp.Logger.Info("data received")
91 e2tinst := rtmgr.E2TInstance{
92 Ranlist: make([]string, len(e2tData.RanNamelist)),
95 e2tinst.Fqdn = *e2tData.E2TAddress
96 e2tinst.Name = "E2TERMINST"
97 copy(e2tinst.Ranlist, e2tData.RanNamelist)
98 if len(e2tData.RanNamelist) > 0 {
100 for _, meid := range e2tData.RanNamelist {
103 str = "mme_ar|" + *e2tData.E2TAddress + "|" + strings.TrimSuffix(meidar, " ")
105 return &e2tinst, str, nil
108 xapp.Logger.Info("No data")
111 xapp.Logger.Debug("Nothing received on the Http interface")
115 func validateXappCallbackData(callbackData *models.XappCallbackData) error {
116 if len(callbackData.XApps) == 0 {
117 return fmt.Errorf("invalid Data field: \"%s\"", callbackData.XApps)
119 var xapps []rtmgr.XApp
120 err := json.Unmarshal([]byte(callbackData.XApps), &xapps)
122 return fmt.Errorf("unmarshal failed: \"%s\"", err.Error())
127 func provideXappHandleHandlerImpl(data *models.XappCallbackData) error {
129 xapp.Logger.Debug("Received callback data")
132 err := validateXappCallbackData(data)
134 xapp.Logger.Warn("XApp callback data validation failed: " + err.Error())
137 appdata, err := recvXappCallbackData(data)
139 xapp.Logger.Error("cannot get data from rest api dute to: " + err.Error())
140 } else if appdata != nil {
141 xapp.Logger.Debug("Fetching all xApps deployed in xApp Manager through GET operation.")
142 alldata, err1 := httpGetXApps(xapp.Config.GetString("xmurl"))
143 if alldata != nil && err1 == nil {
145 sdlEngine.WriteXApps(xapp.Config.GetString("rtfile"), alldata)
148 return sendRoutesToAll()
156 func validateXappSubscriptionData(data *models.XappSubscriptionData) error {
157 var err = fmt.Errorf("XApp instance not found: %v:%v", *data.Address, *data.Port)
158 for _, ep := range rtmgr.Eps {
159 if ep.Ip == *data.Address && ep.Port == *data.Port {
167 func validateE2tData(data *models.E2tData) (error, bool) {
169 e2taddress_key := *data.E2TAddress
170 if e2taddress_key == "" {
171 return fmt.Errorf("E2TAddress is empty!!!"), false
173 stringSlice := strings.Split(e2taddress_key, ":")
174 if len(stringSlice) == 1 {
175 return fmt.Errorf("E2T E2TAddress is not a proper format like ip:port, %v", e2taddress_key), false
178 _, err := net.LookupIP(stringSlice[0])
180 return fmt.Errorf("E2T E2TAddress DNS look up failed, E2TAddress: %v", stringSlice[0]), false
183 if checkValidaE2TAddress(e2taddress_key) {
184 return fmt.Errorf("E2TAddress already exist!!!, E2TAddress: %v", e2taddress_key), true
190 func validateDeleteE2tData(data *models.E2tDeleteData) error {
192 if *data.E2TAddress == "" {
193 return fmt.Errorf("E2TAddress is empty!!!")
196 for _, element := range data.RanAssocList {
197 e2taddress_key := *element.E2TAddress
198 stringSlice := strings.Split(e2taddress_key, ":")
200 if len(stringSlice) == 1 {
201 return fmt.Errorf("E2T Delete - RanAssocList E2TAddress is not a proper format like ip:port, %v", e2taddress_key)
204 if !checkValidaE2TAddress(e2taddress_key) {
205 return fmt.Errorf("E2TAddress doesn't exist!!!, E2TAddress: %v", e2taddress_key)
212 func checkValidaE2TAddress(e2taddress string) bool {
214 _, exist := rtmgr.Eps[e2taddress]
219 func provideXappSubscriptionHandleImpl(data *models.XappSubscriptionData) error {
220 xapp.Logger.Debug("Invoked provideXappSubscriptionHandleImpl")
221 err := validateXappSubscriptionData(data)
223 xapp.Logger.Error(err.Error())
226 xapp.Logger.Debug("received XApp subscription data")
227 addSubscription(&rtmgr.Subs, data)
228 xapp.Logger.Debug("Endpoints: %v", rtmgr.Eps)
230 return sendRoutesToAll()
233 func subscriptionExists(data *models.XappSubscriptionData) bool {
235 sub := rtmgr.Subscription{SubID: *data.SubscriptionID, Fqdn: *data.Address, Port: *data.Port}
236 for _, elem := range rtmgr.Subs {
245 func deleteXappSubscriptionHandleImpl(data *models.XappSubscriptionData) error {
246 xapp.Logger.Debug("Invoked deleteXappSubscriptionHandleImpl")
247 err := validateXappSubscriptionData(data)
249 xapp.Logger.Error(err.Error())
253 if !subscriptionExists(data) {
254 xapp.Logger.Warn("subscription not found: %d", *data.SubscriptionID)
255 err := fmt.Errorf("subscription not found: %d", *data.SubscriptionID)
259 xapp.Logger.Debug("received XApp subscription delete data")
260 delSubscription(&rtmgr.Subs, data)
262 return sendRoutesToAll()
266 func updateXappSubscriptionHandleImpl(data *models.XappList, subid uint16) error {
267 xapp.Logger.Debug("Invoked updateXappSubscriptionHandleImpl")
269 var fqdnlist []rtmgr.FqDn
270 for _, item := range *data {
271 fqdnlist = append(fqdnlist, rtmgr.FqDn(*item))
273 xapplist := rtmgr.XappList{SubscriptionID: subid, FqdnList: fqdnlist}
274 var subdata models.XappSubscriptionData
277 subdata.SubscriptionID = &id
278 for _, items := range fqdnlist {
279 subdata.Address = items.Address
280 subdata.Port = items.Port
281 err := validateXappSubscriptionData(&subdata)
283 xapp.Logger.Error(err.Error())
287 xapp.Logger.Debug("received XApp subscription Merge data")
288 updateSubscription(&xapplist)
290 return sendRoutesToAll()
293 func createNewE2tHandleHandlerImpl(data *models.E2tData) error {
294 xapp.Logger.Debug("Invoked createNewE2tHandleHandlerImpl")
295 err, IsDuplicate := validateE2tData(data)
296 if IsDuplicate == true {
298 return sendRoutesToAll()
302 xapp.Logger.Error(err.Error())
306 e2data, meiddata, _ := recvNewE2Tdata(data)
307 xapp.Logger.Debug("received create New E2T data")
309 sdlEngine.WriteNewE2TInstance(xapp.Config.GetString("rtfile"), e2data, meiddata)
313 time.Sleep(10 * time.Second)
314 for ep, value := range rtmgr.RMRConnStatus {
315 if ep == *data.E2TAddress && value == true {
320 return errors.New("Error while adding new E2T " + *data.E2TAddress)
324 func validateE2TAddressRANListData(assRanE2tData models.RanE2tMap) error {
326 xapp.Logger.Debug("Invoked.validateE2TAddressRANListData : %v", assRanE2tData)
328 for _, element := range assRanE2tData {
329 if *element.E2TAddress == "" {
330 return fmt.Errorf("E2T Instance - E2TAddress is empty!!!")
333 e2taddress_key := *element.E2TAddress
334 if !checkValidaE2TAddress(e2taddress_key) {
335 return fmt.Errorf("E2TAddress doesn't exist!!!, E2TAddress: %v", e2taddress_key)
342 func associateRanToE2THandlerImpl(data models.RanE2tMap) error {
343 xapp.Logger.Debug("Invoked associateRanToE2THandlerImpl")
344 err := validateE2TAddressRANListData(data)
346 xapp.Logger.Warn(" Association of RAN to E2T Instance data validation failed: " + err.Error())
349 xapp.Logger.Debug("received associate RAN list to E2T instance mapping from E2 Manager")
351 sdlEngine.WriteAssRANToE2TInstance(xapp.Config.GetString("rtfile"), data)
354 return sendRoutesToAll()
358 func disassociateRanToE2THandlerImpl(data models.RanE2tMap) error {
359 xapp.Logger.Debug("Invoked disassociateRanToE2THandlerImpl")
360 err := validateE2TAddressRANListData(data)
362 xapp.Logger.Warn(" Disassociation of RAN List from E2T Instance data validation failed: " + err.Error())
365 xapp.Logger.Debug("received disassociate RANs from E2T instance")
367 sdlEngine.WriteDisAssRANFromE2TInstance(xapp.Config.GetString("rtfile"), data)
370 return sendRoutesToAll()
374 func deleteE2tHandleHandlerImpl(data *models.E2tDeleteData) error {
375 xapp.Logger.Debug("Invoked deleteE2tHandleHandlerImpl")
377 err := validateDeleteE2tData(data)
379 xapp.Logger.Error(err.Error())
383 sdlEngine.WriteDeleteE2TInstance(xapp.Config.GetString("rtfile"), data)
386 return sendRoutesToAll()
390 func dumpDebugData() (models.Debuginfo, error) {
391 var response models.Debuginfo
392 sdlEngine, _ := sdl.GetSdl("file")
393 rpeEngine, _ := rpe.GetRpe("rmrpush")
394 data, err := sdlEngine.ReadAll(xapp.Config.GetString("rtfile"))
397 xapp.Logger.Error("Cannot get data from sdl interface due to: " + err.Error())
400 xapp.Logger.Debug("Cannot get data from sdl interface")
401 return response, errors.New("Cannot get data from sdl interface")
404 response.RouteTable = *rpeEngine.GeneratePolicies(rtmgr.Eps, data)
406 prettyJSON, err := json.MarshalIndent(data, "", "")
407 response.RouteConfigs = string(prettyJSON)
412 func launchRest(nbiif *string) {
413 swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON)
416 xapp.Logger.Error(err.Error())
419 nbiUrl, err := url.Parse(*nbiif)
421 xapp.Logger.Error(err.Error())
424 api := operations.NewRoutingManagerAPI(swaggerSpec)
425 server := restapi.NewServer(api)
426 defer server.Shutdown()
428 server.Port, err = strconv.Atoi(nbiUrl.Port())
430 xapp.Logger.Error("Invalid NBI RestAPI port")
433 server.Host = "0.0.0.0"
435 api.HandleProvideXappHandleHandler = handle.ProvideXappHandleHandlerFunc(
436 func(params handle.ProvideXappHandleParams) middleware.Responder {
437 xapp.Logger.Info("Data received on Http interface")
438 err := provideXappHandleHandlerImpl(params.XappCallbackData)
440 xapp.Logger.Error("RoutingManager->AppManager request Failed: " + err.Error())
441 return handle.NewProvideXappHandleBadRequest()
443 xapp.Logger.Info("RoutingManager->AppManager request Success")
444 return handle.NewGetHandlesOK()
447 api.HandleProvideXappSubscriptionHandleHandler = handle.ProvideXappSubscriptionHandleHandlerFunc(
448 func(params handle.ProvideXappSubscriptionHandleParams) middleware.Responder {
449 err := provideXappSubscriptionHandleImpl(params.XappSubscriptionData)
451 xapp.Logger.Error("RoutingManager->SubManager Add Request Failed: " + err.Error())
452 return handle.NewProvideXappSubscriptionHandleBadRequest()
454 xapp.Logger.Info("RoutingManager->SubManager Add Request Success, subid = %v, requestor = %v", *params.XappSubscriptionData.SubscriptionID, *params.XappSubscriptionData.Address)
455 return handle.NewGetHandlesOK()
458 api.HandleDeleteXappSubscriptionHandleHandler = handle.DeleteXappSubscriptionHandleHandlerFunc(
459 func(params handle.DeleteXappSubscriptionHandleParams) middleware.Responder {
460 err := deleteXappSubscriptionHandleImpl(params.XappSubscriptionData)
462 xapp.Logger.Error("RoutingManager->SubManager Delete Request Failed: " + err.Error())
463 return handle.NewDeleteXappSubscriptionHandleNoContent()
465 xapp.Logger.Info("RoutingManager->SubManager Delete Request Success, subid = %v, requestor = %v", *params.XappSubscriptionData.SubscriptionID, *params.XappSubscriptionData.Address)
466 return handle.NewGetHandlesOK()
469 api.HandleUpdateXappSubscriptionHandleHandler = handle.UpdateXappSubscriptionHandleHandlerFunc(
470 func(params handle.UpdateXappSubscriptionHandleParams) middleware.Responder {
471 err := updateXappSubscriptionHandleImpl(¶ms.XappList, params.SubscriptionID)
473 return handle.NewUpdateXappSubscriptionHandleBadRequest()
475 return handle.NewUpdateXappSubscriptionHandleCreated()
478 api.HandleCreateNewE2tHandleHandler = handle.CreateNewE2tHandleHandlerFunc(
479 func(params handle.CreateNewE2tHandleParams) middleware.Responder {
480 err := createNewE2tHandleHandlerImpl(params.E2tData)
482 xapp.Logger.Error("RoutingManager->E2Manager AddE2T Request Failed: " + err.Error())
483 return handle.NewCreateNewE2tHandleBadRequest()
485 xapp.Logger.Info("RoutingManager->E2Manager AddE2T Request Success, E2T = %v", *params.E2tData.E2TAddress)
486 return handle.NewCreateNewE2tHandleCreated()
490 api.HandleAssociateRanToE2tHandleHandler = handle.AssociateRanToE2tHandleHandlerFunc(
491 func(params handle.AssociateRanToE2tHandleParams) middleware.Responder {
492 err := associateRanToE2THandlerImpl(params.RanE2tList)
494 xapp.Logger.Error("RoutingManager->E2Manager associateRanToE2T Request Failed: " + err.Error())
495 return handle.NewAssociateRanToE2tHandleBadRequest()
497 xapp.Logger.Info("RoutingManager->E2Manager associateRanToE2T Request Success, E2T = %v", params.RanE2tList)
498 return handle.NewAssociateRanToE2tHandleCreated()
502 api.HandleDissociateRanHandler = handle.DissociateRanHandlerFunc(
503 func(params handle.DissociateRanParams) middleware.Responder {
504 err := disassociateRanToE2THandlerImpl(params.DissociateList)
506 xapp.Logger.Error("RoutingManager->E2Manager DisassociateRanToE2T Request Failed: " + err.Error())
507 return handle.NewDissociateRanBadRequest()
509 xapp.Logger.Info("RoutingManager->E2Manager DisassociateRanToE2T Request Success, E2T = %v", params.DissociateList)
510 return handle.NewDissociateRanCreated()
514 api.HandleDeleteE2tHandleHandler = handle.DeleteE2tHandleHandlerFunc(
515 func(params handle.DeleteE2tHandleParams) middleware.Responder {
516 err := deleteE2tHandleHandlerImpl(params.E2tData)
518 xapp.Logger.Error("RoutingManager->E2Manager DeleteE2T Request Failed: " + err.Error())
519 return handle.NewDeleteE2tHandleBadRequest()
521 xapp.Logger.Info("RoutingManager->E2Manager DeleteE2T Request Success, E2T = %v", *params.E2tData.E2TAddress)
522 return handle.NewDeleteE2tHandleCreated()
525 api.DebugGetDebuginfoHandler = debug.GetDebuginfoHandlerFunc(
526 func(params debug.GetDebuginfoParams) middleware.Responder {
527 response, err := dumpDebugData()
529 return debug.NewGetDebuginfoCreated()
531 return debug.NewGetDebuginfoOK().WithPayload(&response)
534 api.HandleAddRmrRouteHandler = handle.AddRmrRouteHandlerFunc(
535 func(params handle.AddRmrRouteParams) middleware.Responder {
536 err := adddelrmrroute(params.RoutesList, true)
538 return handle.NewAddRmrRouteBadRequest()
540 return handle.NewAddRmrRouteCreated()
544 api.HandleDelRmrRouteHandler = handle.DelRmrRouteHandlerFunc(
545 func(params handle.DelRmrRouteParams) middleware.Responder {
546 err := adddelrmrroute(params.RoutesList, false)
548 return handle.NewDelRmrRouteBadRequest()
550 return handle.NewDelRmrRouteCreated()
554 // start to serve API
555 xapp.Logger.Info("Starting the HTTP Rest service")
556 if err := server.Serve(); err != nil {
557 xapp.Logger.Error(err.Error())
561 func httpGetXApps(xmurl string) (*[]rtmgr.XApp, error) {
562 xapp.Logger.Info("Invoked httprestful.httpGetXApps: " + xmurl)
563 r, err := myClient.Get(xmurl)
569 if r.StatusCode == 200 {
570 xapp.Logger.Debug("http client raw response: %v", r)
571 var xapps []rtmgr.XApp
572 err = json.NewDecoder(r.Body).Decode(&xapps)
574 xapp.Logger.Warn("Json decode failed: " + err.Error())
576 xapp.Logger.Info("HTTP GET: OK")
577 xapp.Logger.Debug("httprestful.httpGetXApps returns: %v", xapps)
580 xapp.Logger.Warn("httprestful got an unexpected http status code: %v", r.StatusCode)
584 func httpGetE2TList(e2murl string) (*[]rtmgr.E2tIdentity, error) {
585 xapp.Logger.Info("Invoked httprestful.httpGetE2TList: " + e2murl)
586 r, err := myClient.Get(e2murl)
592 if r.StatusCode == 200 {
593 xapp.Logger.Debug("http client raw response: %v", r)
594 var E2Tlist []rtmgr.E2tIdentity
595 err = json.NewDecoder(r.Body).Decode(&E2Tlist)
597 xapp.Logger.Warn("Json decode failed: " + err.Error())
599 xapp.Logger.Info("HTTP GET: OK")
600 xapp.Logger.Debug("httprestful.httpGetXApps returns: %v", E2Tlist)
603 xapp.Logger.Warn("httprestful got an unexpected http status code: %v", r.StatusCode)
607 func PopulateE2TMap(e2tDataList *[]rtmgr.E2tIdentity, e2ts map[string]rtmgr.E2TInstance, meids []string) {
608 xapp.Logger.Info("Invoked httprestful.PopulateE2TMap ")
610 for _, e2tData := range *e2tDataList {
613 e2tinst := rtmgr.E2TInstance{
614 Ranlist: make([]string, len(e2tData.Rannames)),
617 e2tinst.Fqdn = e2tData.E2taddress
618 e2tinst.Name = "E2TERMINST"
619 copy(e2tinst.Ranlist, e2tData.Rannames)
621 if len(e2tData.Rannames) > 0 {
623 for _, meid := range e2tData.Rannames {
626 str += "mme_ar|" + e2tData.E2taddress + "|" + strings.TrimSuffix(meidar, " ")
629 e2ts[e2tinst.Fqdn] = e2tinst
630 meids = append(meids, str)
634 func retrieveStartupData(xmurl string, nbiif string, fileName string, configfile string, e2murl string, sdlEngine sdl.Engine) error {
635 xapp.Logger.Info("Invoked retrieveStartupData ")
639 var xappData *[]rtmgr.XApp
640 xappData = new([]rtmgr.XApp)
641 xapp.Logger.Info("Trying to fetch XApps data from XAPP manager")
642 for i := 1; i <= maxRetries; i++ {
643 time.Sleep(2 * time.Second)
646 xappData, err = httpGetXApps(xmurl)
647 if xappData != nil && err == nil {
649 } else if err == nil {
650 readErr = errors.New("unexpected HTTP status code")
652 xapp.Logger.Warn("cannot get xapp data due to: " + err.Error())
662 e2ts := make(map[string]rtmgr.E2TInstance)
663 xapp.Logger.Info("Trying to fetch E2T data from E2manager")
664 for i := 1; i <= maxRetries; i++ {
667 e2tDataList, err := httpGetE2TList(e2murl)
668 if e2tDataList != nil && err == nil {
669 PopulateE2TMap(e2tDataList, e2ts, meids[:])
671 } else if err == nil {
672 readErr = errors.New("unexpected HTTP status code")
674 xapp.Logger.Warn("cannot get E2T data from E2M due to: " + err.Error())
677 time.Sleep(2 * time.Second)
684 pcData, confErr := rtmgr.GetPlatformComponents(configfile)
686 xapp.Logger.Error(confErr.Error())
689 xapp.Logger.Info("Recieved intial xapp data, E2T data and platform data, writing into SDL.")
690 // Combine the xapps data and platform data before writing to the SDL
691 ricData := &rtmgr.RicComponents{XApps: *xappData, Pcs: *pcData, E2Ts: e2ts, MeidMap: meids}
692 writeErr := sdlEngine.WriteAll(fileName, ricData)
694 xapp.Logger.Error(writeErr.Error())
697 xapp.Logger.Info("Trying to fetch Subscriptions data from Subscription manager")
698 for i := 1; i <= maxRetries; i++ {
700 sub_list, err := xapp.Subscription.QuerySubscriptions()
702 if sub_list != nil && err == nil {
703 PopulateSubscription(sub_list)
707 xapp.Logger.Warn("cannot get xapp data due to: " + readErr.Error())
709 time.Sleep(2 * time.Second)
716 // post subscription req to appmgr
717 readErr = PostSubReq(xmurl, nbiif)
722 //rlist := make(map[string]string)
723 xapp.Logger.Info("Reading SDL for any routes")
724 rlist, sdlerr := xapp.Sdl.Read("routes")
727 xapp.Logger.Info("Value is %s", rlist["routes"])
728 if rlist["routes"] != nil {
729 formstring := fmt.Sprintf("%s", rlist["routes"])
730 xapp.Logger.Info("Value of formed string = %s", formstring)
731 newstring := strings.Split(formstring, " ")
732 for i, _ := range newstring {
733 xapp.Logger.Info("in Loop Value of formed string = %s", newstring)
734 rtmgr.DynamicRouteList = append(rtmgr.DynamicRouteList, newstring[i])
744 func (r *HttpRestful) Initialize(xmurl string, nbiif string, fileName string, configfile string, e2murl string,
745 sdlEngine sdl.Engine, rpeEngine rpe.Engine, m *sync.Mutex) error {
746 err := r.RetrieveStartupData(xmurl, nbiif, fileName, configfile, e2murl, sdlEngine)
748 xapp.Logger.Error("Exiting as nbi failed to get the initial startup data from the xapp manager: " + err.Error())
758 func (r *HttpRestful) Terminate() error {
762 func addSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubscriptionData) bool {
763 xapp.Logger.Debug("Adding the subscription into the subscriptions list")
765 sub := rtmgr.Subscription{SubID: *xappSubData.SubscriptionID, Fqdn: *xappSubData.Address, Port: *xappSubData.Port}
766 for _, elem := range *subs {
768 xapp.Logger.Warn("rtmgr.addSubscription: Subscription already present: %v", elem)
773 *subs = append(*subs, sub)
778 func delSubscription(subs *rtmgr.SubscriptionList, xappSubData *models.XappSubscriptionData) bool {
779 xapp.Logger.Debug("Deleteing the subscription from the subscriptions list")
781 sub := rtmgr.Subscription{SubID: *xappSubData.SubscriptionID, Fqdn: *xappSubData.Address, Port: *xappSubData.Port}
782 for i, elem := range *subs {
785 // Since the order of the list is not important, we are swapping the last element
786 // with the matching element and replacing the list with list(n-1) elements.
787 (*subs)[len(*subs)-1], (*subs)[i] = (*subs)[i], (*subs)[len(*subs)-1]
788 *subs = (*subs)[:len(*subs)-1]
792 if present == false {
793 xapp.Logger.Warn("rtmgr.delSubscription: Subscription = %v, not present in the existing subscriptions", xappSubData)
798 func updateSubscription(data *rtmgr.XappList) {
800 var subdata models.XappSubscriptionData
802 var matchingsubid, deletecount uint8
803 id = int32(data.SubscriptionID)
804 subdata.SubscriptionID = &id
805 for _, subs := range rtmgr.Subs {
806 if int32(data.SubscriptionID) == subs.SubID {
811 for deletecount < matchingsubid {
812 for _, subs := range rtmgr.Subs {
813 if int32(data.SubscriptionID) == subs.SubID {
814 subdata.SubscriptionID = &subs.SubID
815 subdata.Address = &subs.Fqdn
816 subdata.Port = &subs.Port
817 xapp.Logger.Debug("Deletion Subscription List has %v", subdata)
818 delSubscription(&rtmgr.Subs, &subdata)
825 for _, items := range data.FqdnList {
826 subdata.Address = items.Address
827 subdata.Port = items.Port
828 xapp.Logger.Debug("Adding Subscription List has %v", subdata)
829 addSubscription(&rtmgr.Subs, &subdata)
834 func PopulateSubscription(sub_list xfmodel.SubscriptionList) {
835 for _, sub_row := range sub_list {
836 var subdata models.XappSubscriptionData
837 id := int32(sub_row.SubscriptionID)
838 subdata.SubscriptionID = &id
839 for _, ep := range sub_row.Endpoint {
841 stringSlice := strings.Split(ep, ":")
842 subdata.Address = &stringSlice[0]
843 intportval, _ := strconv.Atoi(stringSlice[1])
844 value := uint16(intportval)
845 subdata.Port = &value
846 xapp.Logger.Debug("Adding Subscription List has Address :%v, port :%v, SubscriptionID :%v ", subdata.Address, subdata.Address, subdata.SubscriptionID)
847 addSubscription(&rtmgr.Subs, &subdata)
852 func adddelrmrroute(routelist models.Routelist, rtflag bool) error {
853 xapp.Logger.Info("Updating rmrroute with Route list: %v,flag: %v", routelist, rtflag)
854 for _, rlist := range routelist {
857 if rlist.SubscriptionID == 0 {
860 subid = rlist.SubscriptionID
862 if rlist.SenderEndPoint == "" && rlist.SubscriptionID != 0 {
863 data = fmt.Sprintf("mse|%d|%d|%s\n", *rlist.MessageType, rlist.SubscriptionID, *rlist.TargetEndPoint)
864 } else if rlist.SenderEndPoint == "" && rlist.SubscriptionID == 0 {
865 data = fmt.Sprintf("mse|%d|-1|%s\n", *rlist.MessageType, *rlist.TargetEndPoint)
867 data = fmt.Sprintf("mse|%d,%s|%d|%s\n", *rlist.MessageType, rlist.SenderEndPoint, subid, *rlist.TargetEndPoint)
869 err := checkrepeatedroute(data)
873 xapp.Logger.Info("Given route %s is a duplicate", data)
875 rtmgr.DynamicRouteList = append(rtmgr.DynamicRouteList, data)
876 routearray := strings.Join(rtmgr.DynamicRouteList, " ")
877 xapp.Sdl.Store("routes", routearray)
880 xapp.Logger.Info("Successfully deleted route: %s", data)
881 routearray := strings.Join(rtmgr.DynamicRouteList, " ")
882 xapp.Sdl.Store("routes", routearray)
884 xapp.Logger.Info("No such route: %s", data)
885 return errors.New("No such route: " + data)
891 return sendRoutesToAll()
894 func checkrepeatedroute(data string) bool {
895 for i := 0; i < len(rtmgr.DynamicRouteList); i++ {
896 if rtmgr.DynamicRouteList[i] == data {
897 rtmgr.DynamicRouteList[i] = rtmgr.DynamicRouteList[len(rtmgr.DynamicRouteList)-1]
898 rtmgr.DynamicRouteList[len(rtmgr.DynamicRouteList)-1] = ""
899 rtmgr.DynamicRouteList = rtmgr.DynamicRouteList[:len(rtmgr.DynamicRouteList)-1]