blob: b080bcbaf6bbbf27f25f9c31dc72753adfca3dc0 [file] [log] [blame]
Balint Uveges871fa392019-04-02 20:31:11 +00001/*
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.
wahidw761934a2019-11-27 06:07:26 +000017
18
19 This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 platform project (RICP).
21
Balint Uveges871fa392019-04-02 20:31:11 +000022==================================================================================
23*/
24/*
25 Mnemonic: rpe.go
26 Abstract: Contains RPE (Route Policy Engine) module definitions and generic RPE components
27 Date: 16 March 2019
28*/
29
30package rpe
31
32import (
33 "errors"
wahidwa8596ec2019-12-05 06:30:42 +000034 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
kalnagy92162652019-07-02 15:15:49 +020035 "routing-manager/pkg/rtmgr"
zkoczkaeb2ff0d2019-09-26 16:59:54 +020036 "routing-manager/pkg/sbi"
prabhukaliswamyb47d12d2019-12-03 15:06:30 +000037 "runtime"
wahidwa8596ec2019-12-05 06:30:42 +000038 "strconv"
Balint Uveges871fa392019-04-02 20:31:11 +000039)
40
41var (
zkoczkaaaf8d392019-10-02 17:16:06 +020042 SupportedRpes = []*EngineConfig{
43 {
kalnagy92162652019-07-02 15:15:49 +020044 Name: "rmrpush",
45 Version: "pubsush",
46 Protocol: "rmruta",
47 Instance: NewRmrPush(),
48 IsAvailable: true,
Balint Uveges871fa392019-04-02 20:31:11 +000049 },
50 }
51)
52
zkoczkaaaf8d392019-10-02 17:16:06 +020053func GetRpe(rpeName string) (Engine, error) {
Balint Uveges871fa392019-04-02 20:31:11 +000054 for _, rpe := range SupportedRpes {
kalnagy92162652019-07-02 15:15:49 +020055 if rpe.Name == rpeName && rpe.IsAvailable {
56 return rpe.Instance, nil
Balint Uveges871fa392019-04-02 20:31:11 +000057 }
58 }
Peter Szilagyi16d84d62019-04-24 14:51:02 +000059 return nil, errors.New("SBI:" + rpeName + " is not supported or still not a available")
Balint Uveges871fa392019-04-02 20:31:11 +000060}
61
kalnagy92162652019-07-02 15:15:49 +020062type Rpe struct {
63}
64
kalnagy92162652019-07-02 15:15:49 +020065func getEndpointByName(eps *rtmgr.Endpoints, name string) *rtmgr.Endpoint {
66 for _, ep := range *eps {
67 if ep.Name == name {
wahidwa8596ec2019-12-05 06:30:42 +000068 xapp.Logger.Debug("name: %s", ep.Name)
69 xapp.Logger.Debug("ep: %v", ep)
kalnagy92162652019-07-02 15:15:49 +020070 return ep
71 }
72 }
73 return nil
74}
75
rangajal749099b2019-12-10 09:37:08 +000076func getEndpointListByName(eps *rtmgr.Endpoints, name string) []rtmgr.Endpoint {
wahidwda0fd3a2020-01-01 04:28:41 +000077 var eplist []rtmgr.Endpoint
rangajal749099b2019-12-10 09:37:08 +000078
wahidwda0fd3a2020-01-01 04:28:41 +000079 for _, ep := range *eps {
80 if ep.Name == name {
81 xapp.Logger.Debug("name: %s", ep.Name)
82 xapp.Logger.Debug("ep: %v", ep)
83 eplist = append(eplist, *ep)
84 }
85 }
86 return eplist
rangajal749099b2019-12-10 09:37:08 +000087}
88
zkoczkaeb2ff0d2019-09-26 16:59:54 +020089func getEndpointByUuid(uuid string) *rtmgr.Endpoint {
90 endPoints := rtmgr.Eps
91 for _, ep := range endPoints {
kalnagy92162652019-07-02 15:15:49 +020092 if ep.Uuid == uuid {
wahidwa8596ec2019-12-05 06:30:42 +000093 xapp.Logger.Debug("name: %s", ep.Uuid)
94 xapp.Logger.Debug("ep: %v", ep)
kalnagy92162652019-07-02 15:15:49 +020095 return ep
96 }
97 }
98 return nil
99}
kalnagy92162652019-07-02 15:15:49 +0200100
rangajal749099b2019-12-10 09:37:08 +0000101func (r *Rpe) addRoute(messageType string, tx *rtmgr.Endpoint, rx *rtmgr.Endpoint, routeTable *rtmgr.RouteTable, subId int32, routeType string) {
102 txList := rtmgr.EndpointList{}
103 rxList := []rtmgr.EndpointList{}
104
105 if tx == nil && rx == nil {
wahidwda0fd3a2020-01-01 04:28:41 +0000106 pc, _, _, ok := runtime.Caller(1)
107 details := runtime.FuncForPC(pc)
108 if ok && details != nil {
109 xapp.Logger.Error("Route addition skipped: Either TX or RX endpoint not present. Caller function is %s", details.Name())
wahidwa8596ec2019-12-05 06:30:42 +0000110 }
wahidwa8596ec2019-12-05 06:30:42 +0000111 } else {
wahidwda0fd3a2020-01-01 04:28:41 +0000112 if tx != nil {
113 txList = rtmgr.EndpointList{*tx}
114 }
115 if rx != nil {
116 rxList = []rtmgr.EndpointList{[]rtmgr.Endpoint{*rx}}
117 }
118 messageId := strconv.Itoa(xapp.RICMessageTypes[messageType])
119 route := rtmgr.RouteTableEntry{
120 MessageType: messageId,
121 TxList: txList,
122 RxGroups: rxList,
123 SubID: subId,
124 RouteType: routeType}
125 *routeTable = append(*routeTable, route)
126 // xapp.Logger.Debug("Route added: MessageTyp: %v, Tx: %v, Rx: %v, SubId: %v", messageId, tx.Uuid, rx.Uuid, subId)
127 // xapp.Logger.Trace("Route added: MessageTyp: %v, Tx: %v, Rx: %v, SubId: %v", messageId, tx, rx, subId)
wahidwa8596ec2019-12-05 06:30:42 +0000128 }
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200129}
130
rangajal749099b2019-12-10 09:37:08 +0000131func (r *Rpe) addRoute_rx_list(messageType string, tx *rtmgr.Endpoint, rx []rtmgr.Endpoint, routeTable *rtmgr.RouteTable, subId int32, routeType string) {
132 txList := rtmgr.EndpointList{}
133 rxList := []rtmgr.EndpointList{}
134
wahidwda0fd3a2020-01-01 04:28:41 +0000135 if tx != nil {
136 txList = rtmgr.EndpointList{*tx}
rangajal749099b2019-12-10 09:37:08 +0000137 }
138
wahidwda0fd3a2020-01-01 04:28:41 +0000139 if rx != nil {
wahidw6977ffd2020-02-08 19:00:02 +0000140 for _, item := range rx {
141 ep := []rtmgr.Endpoint{item}
142 rxList = append(rxList, ep)
143 }
rangajal749099b2019-12-10 09:37:08 +0000144 }
145
wahidwda0fd3a2020-01-01 04:28:41 +0000146 messageId := strconv.Itoa(xapp.RICMessageTypes[messageType])
rangajal749099b2019-12-10 09:37:08 +0000147 route := rtmgr.RouteTableEntry{
wahidwda0fd3a2020-01-01 04:28:41 +0000148 MessageType: messageId,
149 TxList: txList,
150 RxGroups: rxList,
151 SubID: subId,
152 RouteType: routeType}
rangajal749099b2019-12-10 09:37:08 +0000153 *routeTable = append(*routeTable, route)
wahidwda0fd3a2020-01-01 04:28:41 +0000154 // xapp.Logger.Debug("Route added: MessageTyp: %v, Tx: %v, Rx: %v, SubId: %v", messageId, tx.Uuid, rx.Uuid, subId)
155 // xapp.Logger.Trace("Route added: MessageTyp: %v, Tx: %v, Rx: %v, SubId: %v", messageId, tx, rx, subId)
rangajal749099b2019-12-10 09:37:08 +0000156}
157
wahidwcd7867c2020-02-05 10:01:12 +0000158func (r *Rpe) generateXappRoutes(xAppEp *rtmgr.Endpoint, subManEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) {
wahidwa8596ec2019-12-05 06:30:42 +0000159 xapp.Logger.Debug("rpe.generateXappRoutes invoked")
160 xapp.Logger.Debug("Endpoint: %v, xAppType: %v", xAppEp.Name, xAppEp.XAppType)
161 if xAppEp.XAppType != sbi.PlatformType && (len(xAppEp.TxMessages) > 0 || len(xAppEp.RxMessages) > 0) {
wahidwda0fd3a2020-01-01 04:28:41 +0000162 /// TODO ---
zkoczkaaaf8d392019-10-02 17:16:06 +0200163 //xApp -> Subscription Manager
rangajal749099b2019-12-10 09:37:08 +0000164 r.addRoute("RIC_SUB_REQ", xAppEp, subManEp, routeTable, -1, "")
165 r.addRoute("RIC_SUB_DEL_REQ", xAppEp, subManEp, routeTable, -1, "")
zkoczkaaaf8d392019-10-02 17:16:06 +0200166 //xApp -> E2 Termination
wahidwda0fd3a2020-01-01 04:28:41 +0000167 // r.addRoute("RIC_CONTROL_REQ", xAppEp, e2TermEp, routeTable, -1, "")
prabhukaliswamye110ee02019-12-23 09:51:01 +0000168 r.addRoute("RIC_CONTROL_REQ", xAppEp, nil, routeTable, -1, "%meid")
zkoczkab95b0762019-10-29 13:05:48 +0100169 //E2 Termination -> xApp
wahidwda0fd3a2020-01-01 04:28:41 +0000170 /// r.addRoute("RIC_CONTROL_ACK", e2TermEp, xAppEp, routeTable, -1, "")
171 /// r.addRoute("RIC_CONTROL_FAILURE", e2TermEp, xAppEp, routeTable, -1, "")
prabhukaliswamye110ee02019-12-23 09:51:01 +0000172 r.addRoute("RIC_CONTROL_ACK", nil, xAppEp, routeTable, -1, "")
173 r.addRoute("RIC_CONTROL_FAILURE", nil, xAppEp, routeTable, -1, "")
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200174 }
wahidwa8596ec2019-12-05 06:30:42 +0000175 //xApp->A1Mediator
176 if xAppEp.XAppType != sbi.PlatformType && len(xAppEp.Policies) > 0 {
177 xapp.Logger.Debug("rpe.generateXappRoutes found policies section")
178 for _, policy := range xAppEp.Policies {
rangajal749099b2019-12-10 09:37:08 +0000179 r.addRoute("A1_POLICY_REQ", nil, xAppEp, routeTable, policy, "")
wahidwa8596ec2019-12-05 06:30:42 +0000180 }
181 }
182
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200183}
184
rangajal0baa70d2020-03-31 12:28:53 +0000185
186func (r *Rpe) generateXappToXappRoutes(RecvxAppEp *rtmgr.Endpoint, endPointList rtmgr.Endpoints, routeTable *rtmgr.RouteTable) {
187 xapp.Logger.Debug("rpe.generateXappToXappRoutes invoked")
188
189 for _, rxmsg := range RecvxAppEp.RxMessages {
190
191 var src_present bool
192 xapp.Logger.Debug("RecvxAppEp.RxMessages Endpoint: %v, xAppType: %v and rxmsg: %v ", RecvxAppEp.Name, RecvxAppEp.XAppType, rxmsg)
193 if (rxmsg != "RIC_SUB_RESP" && rxmsg != "RIC_SUB_FAILURE" && rxmsg != "RIC_SUB_DEL_RESP" && rxmsg != "RIC_SUB_DEL_FAILURE" && rxmsg != "RIC_INDICATION" && rxmsg != "RIC_CONTROL_ACK" && rxmsg != "RIC_CONTROL_FAILURE" && rxmsg != "A1_POLICY_REQ") {
194 for _, SrcxAppEp := range endPointList {
195 if SrcxAppEp.XAppType != sbi.PlatformType && (len(SrcxAppEp.TxMessages) > 0) && SrcxAppEp.Name != RecvxAppEp.Name {
196 for _, txmsg := range SrcxAppEp.TxMessages {
197 if (rxmsg == txmsg) {
198 r.addRoute(rxmsg, SrcxAppEp, RecvxAppEp, routeTable, -1, "")
199 src_present = true
200 break
201 }
202 }
203 }
204 }
205 if src_present == false {
206 r.addRoute(rxmsg, nil, RecvxAppEp, routeTable, -1, "")
207 }
208 }
209
210 }
211}
212
wahidwcd7867c2020-02-05 10:01:12 +0000213func (r *Rpe) generateSubscriptionRoutes(selectedxAppEp *rtmgr.Endpoint, subManEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) {
wahidwa8596ec2019-12-05 06:30:42 +0000214 xapp.Logger.Debug("rpe.addSubscriptionRoutes invoked")
zkoczkaaaf8d392019-10-02 17:16:06 +0200215 subscriptionList := &rtmgr.Subs
216 for _, subscription := range *subscriptionList {
wahidwa8596ec2019-12-05 06:30:42 +0000217 xapp.Logger.Debug("Subscription: %v", subscription)
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200218 xAppUuid := subscription.Fqdn + ":" + strconv.Itoa(int(subscription.Port))
wahidwa8596ec2019-12-05 06:30:42 +0000219 xapp.Logger.Debug("xApp UUID: %v", xAppUuid)
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200220 xAppEp := getEndpointByUuid(xAppUuid)
rangajald14518e2020-04-21 12:33:37 +0000221 if xAppEp != nil {
222 if xAppEp.Uuid == selectedxAppEp.Uuid {
223 xapp.Logger.Debug("xApp UUID is matched for selected xApp.UUID: %v and xApp.Name: %v", selectedxAppEp.Uuid, selectedxAppEp.Name)
224 /// TODO
225 //Subscription Manager -> xApp
226 r.addRoute("RIC_SUB_RESP", subManEp, xAppEp, routeTable, subscription.SubID, "")
227 r.addRoute("RIC_SUB_FAILURE", subManEp, xAppEp, routeTable, subscription.SubID, "")
228 r.addRoute("RIC_SUB_DEL_RESP", subManEp, xAppEp, routeTable, subscription.SubID, "")
229 r.addRoute("RIC_SUB_DEL_FAILURE", subManEp, xAppEp, routeTable, subscription.SubID, "")
230 //E2 Termination -> xApp
231 r.addRoute("RIC_INDICATION", nil, xAppEp, routeTable, subscription.SubID, "")
232 r.addRoute("RIC_CONTROL_ACK", nil, xAppEp, routeTable, subscription.SubID, "")
233 r.addRoute("RIC_CONTROL_FAILURE", nil, xAppEp, routeTable, subscription.SubID, "")
234 }
235 } else {
236 xapp.Logger.Error("generateSubscriptionRoutes xAppEp is nil, xApp UUID: %v", xAppUuid)
prabhukaliswamyb47d12d2019-12-03 15:06:30 +0000237 }
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200238 }
239}
240
wahidwcd7867c2020-02-05 10:01:12 +0000241func (r *Rpe) generatePlatformRoutes(e2TermEp []rtmgr.Endpoint, subManEp *rtmgr.Endpoint, e2ManEp *rtmgr.Endpoint, rsmEp *rtmgr.Endpoint, a1mediatorEp *rtmgr.Endpoint, routeTable *rtmgr.RouteTable) {
wahidwa8596ec2019-12-05 06:30:42 +0000242 xapp.Logger.Debug("rpe.generatePlatformRoutes invoked")
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200243 //Platform Routes --- Subscription Routes
244 //Subscription Manager -> E2 Termination
wahidwda0fd3a2020-01-01 04:28:41 +0000245 for _, routes := range *rtmgr.PrsCfg {
246 var sendEp *rtmgr.Endpoint
247 var Ep *rtmgr.Endpoint
248 switch routes.SenderEndPoint {
249 case "SUBMAN":
250 sendEp = subManEp
251 case "E2MAN":
252 sendEp = e2ManEp
wahidwcd7867c2020-02-05 10:01:12 +0000253 //case "UEMAN":
254 // sendEp = ueManEp
wahidwda0fd3a2020-01-01 04:28:41 +0000255 case "RSM":
256 sendEp = rsmEp
257 case "A1MEDIATOR":
258 sendEp = a1mediatorEp
259 }
260 switch routes.EndPoint {
261 case "SUBMAN":
262 Ep = subManEp
263 case "E2MAN":
264 Ep = e2ManEp
wahidwcd7867c2020-02-05 10:01:12 +0000265 //case "UEMAN":
266 // Ep = ueManEp
wahidwda0fd3a2020-01-01 04:28:41 +0000267 case "RSM":
268 Ep = rsmEp
269 case "A1MEDIATOR":
270 Ep = a1mediatorEp
271 }
rangajal6d209042020-01-08 12:18:39 +0000272
wahidwda0fd3a2020-01-01 04:28:41 +0000273 r.addRoute(routes.MessageType, sendEp, Ep, routeTable, routes.SubscriptionId, routes.Meid)
274 }
rangajal6d209042020-01-08 12:18:39 +0000275
276 if len(e2TermEp) > 0 {
277 r.addRoute_rx_list("RIC_SCTP_CLEAR_ALL", e2ManEp, e2TermEp, routeTable, -1, "")
278 r.addRoute_rx_list("E2_TERM_KEEP_ALIVE_REQ", e2ManEp, e2TermEp, routeTable, -1, "")
wahidwdd6b0562020-03-31 03:09:45 +0000279 r.addRoute_rx_list("RIC_E2_SETUP_RESP", e2ManEp, e2TermEp, routeTable, -1, "")
280 r.addRoute_rx_list("RIC_E2_SETUP_FAILURE", e2ManEp, e2TermEp, routeTable, -1, "")
rangajal6d209042020-01-08 12:18:39 +0000281 }
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200282}
283
284func (r *Rpe) generateRouteTable(endPointList rtmgr.Endpoints) *rtmgr.RouteTable {
wahidwa8596ec2019-12-05 06:30:42 +0000285 xapp.Logger.Debug("rpe.generateRouteTable invoked")
286 xapp.Logger.Debug("Endpoint List: %v", endPointList)
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200287 routeTable := &rtmgr.RouteTable{}
wahidwcd7867c2020-02-05 10:01:12 +0000288 /*e2TermEp := getEndpointByName(&endPointList, "E2TERM")
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200289 if e2TermEp == nil {
wahidwa8596ec2019-12-05 06:30:42 +0000290 xapp.Logger.Error("Platform component not found: %v", "E2 Termination")
291 xapp.Logger.Debug("Endpoints: %v", endPointList)
wahidwcd7867c2020-02-05 10:01:12 +0000292 }*/
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200293 subManEp := getEndpointByName(&endPointList, "SUBMAN")
294 if subManEp == nil {
wahidwa8596ec2019-12-05 06:30:42 +0000295 xapp.Logger.Error("Platform component not found: %v", "Subscription Manager")
296 xapp.Logger.Debug("Endpoints: %v", endPointList)
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200297 }
298 e2ManEp := getEndpointByName(&endPointList, "E2MAN")
299 if e2ManEp == nil {
wahidwa8596ec2019-12-05 06:30:42 +0000300 xapp.Logger.Error("Platform component not found: %v", "E2 Manager")
301 xapp.Logger.Debug("Endpoints: %v", endPointList)
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200302 }
wahidwcd7867c2020-02-05 10:01:12 +0000303 /*ueManEp := getEndpointByName(&endPointList, "UEMAN")
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200304 if ueManEp == nil {
wahidwa8596ec2019-12-05 06:30:42 +0000305 xapp.Logger.Error("Platform component not found: %v", "UE Manger")
306 xapp.Logger.Debug("Endpoints: %v", endPointList)
wahidwcd7867c2020-02-05 10:01:12 +0000307 }*/
prabhukaliswamybe9f2682019-11-22 07:24:09 +0000308 rsmEp := getEndpointByName(&endPointList, "RSM")
309 if rsmEp == nil {
wahidwa8596ec2019-12-05 06:30:42 +0000310 xapp.Logger.Error("Platform component not found: %v", "Resource Status Manager")
311 xapp.Logger.Debug("Endpoints: %v", endPointList)
prabhukaliswamybe9f2682019-11-22 07:24:09 +0000312 }
wahidwa8596ec2019-12-05 06:30:42 +0000313 A1MediatorEp := getEndpointByName(&endPointList, "A1MEDIATOR")
314 if A1MediatorEp == nil {
315 xapp.Logger.Error("Platform component not found: %v", "A1Mediator")
316 xapp.Logger.Debug("Endpoints: %v", endPointList)
317 }
318
rangajal749099b2019-12-10 09:37:08 +0000319 e2TermListEp := getEndpointListByName(&endPointList, "E2TERMINST")
320 if len(e2TermListEp) == 0 {
321 xapp.Logger.Error("Platform component not found: %v", "E2 Termination List")
322 xapp.Logger.Debug("Endpoints: %v", endPointList)
323 }
wahidwcd7867c2020-02-05 10:01:12 +0000324 r.generatePlatformRoutes(e2TermListEp, subManEp, e2ManEp, rsmEp, A1MediatorEp, routeTable)
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200325
326 for _, endPoint := range endPointList {
wahidwa8596ec2019-12-05 06:30:42 +0000327 xapp.Logger.Debug("Endpoint: %v, xAppType: %v", endPoint.Name, endPoint.XAppType)
328 if endPoint.XAppType != sbi.PlatformType && (len(endPoint.TxMessages) > 0 || len(endPoint.RxMessages) > 0) {
wahidwcd7867c2020-02-05 10:01:12 +0000329 r.generateXappRoutes(endPoint, subManEp, routeTable)
330 r.generateSubscriptionRoutes(endPoint, subManEp, routeTable)
rangajal0baa70d2020-03-31 12:28:53 +0000331 r.generateXappToXappRoutes(endPoint, endPointList, routeTable)
332
zkoczkaeb2ff0d2019-09-26 16:59:54 +0200333 }
334 }
335 return routeTable
kalnagy92162652019-07-02 15:15:49 +0200336}