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 ==================================================================================
26 Abstract: RMR Route Policy implementation
27 Produces RMR (RIC Management Routing) formatted route messages
34 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
35 "routing-manager/pkg/models"
36 "routing-manager/pkg/rtmgr"
49 func NewRmrPush() *RmrPush {
50 instance := new(RmrPush)
55 Produces the raw route message consumable by RMR
57 func (r *Rmr) generateRMRPolicies(eps rtmgr.Endpoints, rcs *rtmgr.RicComponents, key string) *[]string {
58 rawrt := []string{key + "newrt|start\n"}
59 rt := r.generateRouteTable(eps)
60 for _, rte := range *rt {
61 rawrte := key + "mse|" + rte.MessageType
62 for _, tx := range rte.TxList {
63 rawrte += "," + tx.Ip + ":" + strconv.Itoa(int(tx.Port))
65 rawrte += "|" + strconv.Itoa(int(rte.SubID)) + "|"
67 for _, rxg := range rte.RxGroups {
69 for _, rx := range rxg {
71 member += rx.Ip + ":" + strconv.Itoa(int(rx.Port))
73 member += "," + rx.Ip + ":" + strconv.Itoa(int(rx.Port))
84 if rte.RouteType == "%meid" {
85 rawrte += group + rte.RouteType
88 rawrt = append(rawrt, rawrte+"\n")
90 for _, val := range rtmgr.DynamicRouteList {
91 rawrt = append(rawrt, val)
94 rawrt = append(rawrt, key+"newrt|end\n")
97 rawrt = append(rawrt, key+"meid_map|start\n")
98 keys := make(map[string]RouteIndex)
99 for _, value := range rcs.MeidMap {
100 if _, v := keys[key+value+"\n"]; !v {
101 rawrt = append(rawrt, key+value+"\n")
102 appendedindex := uint16(len(rawrt)-1)
103 keys[key+value+"\n"] = RouteIndex{true,appendedindex}
106 if strings.Contains(value,"mme_ar") {
107 tmpstr := strings.Split(value,"|")
109 MEID := strings.TrimSuffix(tmpstr[2],"\n")
111 mapindex := "mme_del|"+MEID+"\n"
112 i := keys[mapindex].index
113 if keys[mapindex].flag {
114 copy(rawrt[i:], rawrt[i+1:])
115 rawrt[len(rawrt)-1] = ""
116 rawrt = rawrt[:len(rawrt)-1]
117 delete(keys,mapindex)
122 rawrt = append(rawrt, key+"meid_map|end|"+strconv.Itoa(count)+"\n")
124 xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt)
125 xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rcs)
130 Produces the raw route message consumable by RMR
132 func (r *Rmr) generatePartialRMRPolicies(eps rtmgr.Endpoints, xappSubData *models.XappSubscriptionData, key string, updatetype rtmgr.RMRUpdateType) *[]string {
133 rawrt := []string{key + "updatert|start\n"}
134 rt := r.generatePartialRouteTable(eps, xappSubData, updatetype)
135 for _, rte := range *rt {
136 rawrte := key + "mse|" + rte.MessageType
137 for _, tx := range rte.TxList {
138 rawrte += "," + tx.Ip + ":" + strconv.Itoa(int(tx.Port))
140 rawrte += "|" + strconv.Itoa(int(rte.SubID)) + "|"
142 for _, rxg := range rte.RxGroups {
144 for _, rx := range rxg {
146 member += rx.Ip + ":" + strconv.Itoa(int(rx.Port))
148 member += "," + rx.Ip + ":" + strconv.Itoa(int(rx.Port))
154 group += ";" + member
159 if rte.RouteType == "%meid" {
160 rawrte += group + rte.RouteType
163 rawrt = append(rawrt, rawrte+"\n")
166 rawrt = append(rawrt, key+"updatert|end\n")
169 xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt)
172 func (r *RmrPush) GeneratePolicies(eps rtmgr.Endpoints, rcs *rtmgr.RicComponents) *[]string {
173 xapp.Logger.Debug("Invoked rmr.GeneratePolicies, args: %v: ", eps)
174 return r.generateRMRPolicies(eps, rcs, "")
177 func (r *RmrPush) GenerateRouteTable(eps rtmgr.Endpoints) *rtmgr.RouteTable {
178 return r.generateRouteTable(eps)
181 func (r *RmrPush) GeneratePartialPolicies(eps rtmgr.Endpoints, xappSubData *models.XappSubscriptionData, updatetype rtmgr.RMRUpdateType) *[]string {
182 xapp.Logger.Debug("Invoked rmr.GeneratePartialRMR, args: %v: ", eps)
183 return r.generatePartialRMRPolicies(eps, xappSubData, "", updatetype)