fixed issue in meid table if same meid is associated with different E2T
[ric-plt/rtmgr.git] / pkg / rpe / rmr.go
1 /*
2 ==================================================================================
3   Copyright (c) 2019 AT&T Intellectual Property.
4   Copyright (c) 2019 Nokia
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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.
17
18
19    This source code is part of the near-RT RIC (RAN Intelligent Controller)
20    platform project (RICP).
21
22 ==================================================================================
23 */
24 /*
25   Mnemonic:     rmr.go
26   Abstract:     RMR Route Policy implementation
27                 Produces RMR (RIC Management Routing) formatted route messages
28   Date:         16 March 2019
29 */
30
31 package rpe
32
33 import (
34         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
35         "routing-manager/pkg/models"
36         "routing-manager/pkg/rtmgr"
37         "strconv"
38         "strings"
39 )
40
41 type Rmr struct {
42         Rpe
43 }
44
45 type RmrPush struct {
46         Rmr
47 }
48
49 func NewRmrPush() *RmrPush {
50         instance := new(RmrPush)
51         return instance
52 }
53
54 /*
55 Produces the raw route message consumable by RMR
56 */
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))
64                 }
65                 rawrte += "|" + strconv.Itoa(int(rte.SubID)) + "|"
66                 group := ""
67                 for _, rxg := range rte.RxGroups {
68                         member := ""
69                         for _, rx := range rxg {
70                                 if member == "" {
71                                         member += rx.Ip + ":" + strconv.Itoa(int(rx.Port))
72                                 } else {
73                                         member += "," + rx.Ip + ":" + strconv.Itoa(int(rx.Port))
74                                 }
75                         }
76                         if group == "" {
77                                 group += member
78                         } else {
79                                 group += ";" + member
80                         }
81                 }
82
83                 if rte.RouteType == "%meid" {
84                         rawrte += "%" + "meid"
85                 } else {
86                         rawrte += group
87                 }
88
89                 rawrt = append(rawrt, rawrte+"\n")
90         }
91         for _, val := range rtmgr.DynamicRouteList {
92                 rawrt = append(rawrt, val)
93         }
94
95         rawrt = append(rawrt, key+"newrt|end\n")
96         count := 0
97
98         rawrt = append(rawrt, key+"meid_map|start\n")
99         
100         keys := make(map[string]MeidEntry)
101         MEID := ""
102         E2TIP := ""
103         RECTYP := ""
104         for _, value := range rcs.MeidMap {
105                 if strings.Contains(value, "mme_ar") {
106                         tmpstr := strings.Split(value, "|")
107                         //MEID entry for mme_ar must always contain 3 strings speartred by | i.e "mme_ar|<string1>|<string2>"
108                         MEID = strings.TrimSuffix(tmpstr[2], "\n")
109                         E2TIP = strings.TrimSuffix(tmpstr[1], "\n")
110                         RECTYP = "mme_ar"
111                 } else if strings.Contains(value, "mme_del") {
112                         tmpstr := strings.Split(value, "|")
113                         MEID = strings.TrimSuffix(tmpstr[1], "\n")
114                         E2TIP = ""
115                         RECTYP = "mme_del"
116                 }
117                 keys[MEID] = MeidEntry{RECTYP, E2TIP}
118         }
119
120         for k, v := range keys {
121                 if v.recordtype == "mme_ar" {
122                         rawrt = append(rawrt, key+v.recordtype+"|"+v.e2tip+"|"+k+"\n")
123                     count++
124                 }
125         }
126
127         rawrt = removeEmptyStrings(rawrt)
128         rawrt = append(rawrt, key+"meid_map|end|"+strconv.Itoa(count)+"\n")
129
130         xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt)
131         xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rcs)
132         return &rawrt
133 }
134
135 /*
136 Produces the raw route message consumable by RMR
137 */
138 func (r *Rmr) generatePartialRMRPolicies(eps rtmgr.Endpoints, xappSubData *models.XappSubscriptionData, key string, updatetype rtmgr.RMRUpdateType) *[]string {
139         rawrt := []string{key + "updatert|start\n"}
140         rt := r.generatePartialRouteTable(eps, xappSubData, updatetype)
141         for _, rte := range *rt {
142                 rawrte := key + "mse|" + rte.MessageType
143                 for _, tx := range rte.TxList {
144                         rawrte += "," + tx.Ip + ":" + strconv.Itoa(int(tx.Port))
145                 }
146                 rawrte += "|" + strconv.Itoa(int(rte.SubID)) + "|"
147                 group := ""
148                 for _, rxg := range rte.RxGroups {
149                         member := ""
150                         for _, rx := range rxg {
151                                 if member == "" {
152                                         member += rx.Ip + ":" + strconv.Itoa(int(rx.Port))
153                                 } else {
154                                         member += "," + rx.Ip + ":" + strconv.Itoa(int(rx.Port))
155                                 }
156                         }
157                         if group == "" {
158                                 group += member
159                         } else {
160                                 group += ";" + member
161                         }
162                 }
163
164                 if rte.RouteType == "%meid" {
165                         rawrte += "%" + "meid"
166                 } else {
167                         rawrte += group
168                 }
169
170                 rawrt = append(rawrt, rawrte+"\n")
171         }
172
173         rawrt = append(rawrt, key+"updatert|end\n")
174         //count := 0
175
176         xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt)
177         return &rawrt
178 }
179 func (r *RmrPush) GeneratePolicies(eps rtmgr.Endpoints, rcs *rtmgr.RicComponents) *[]string {
180         xapp.Logger.Debug("Invoked rmr.GeneratePolicies, args: %v: ", eps)
181         return r.generateRMRPolicies(eps, rcs, "")
182 }
183
184 func (r *RmrPush) GenerateRouteTable(eps rtmgr.Endpoints) *rtmgr.RouteTable {
185         return r.generateRouteTable(eps)
186 }
187
188 func (r *RmrPush) GeneratePartialPolicies(eps rtmgr.Endpoints, xappSubData *models.XappSubscriptionData, updatetype rtmgr.RMRUpdateType) *[]string {
189         xapp.Logger.Debug("Invoked rmr.GeneratePartialPolicies, args: %v: ", eps)
190         return r.generatePartialRMRPolicies(eps, xappSubData, "", updatetype)
191 }
192
193 func removeEmptyStrings(s []string) []string {
194         var r []string
195         for _, str := range s {
196                 if str != "" {
197                         r = append(r, str)
198                 }
199         }
200         return r
201 }