Upgraded to RMR 4.7.4 and some improvements
[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                 rawrte += group
83
84                 if rte.RouteType == "%meid" {
85                         rawrte += group + rte.RouteType
86                 }
87
88                 rawrt = append(rawrt, rawrte+"\n")
89         }
90         for _, val := range rtmgr.DynamicRouteList {
91                 rawrt = append(rawrt, val)
92         }
93
94         rawrt = append(rawrt, key+"newrt|end\n")
95         count := 0
96
97         //meidrt := key + "meid_map|start\n"
98         //meidrt := []string{key + "meid_map|start\n"}
99         rawrt = append(rawrt, key+"meid_map|start\n")
100         for _, value := range rcs.MeidMap {
101                 //meidrt += key + value + "\n"
102                 rawrt = append(rawrt, key+value+"\n")
103                 count++
104         }
105         rawrt = append(rawrt, key+"meid_map|end|"+strconv.Itoa(count)+"\n")
106         //meidrt += key+"meid_map|end|" + strconv.Itoa(count) +"\n"
107
108         /*for _, value := range meidrt {
109                 rawrt = append(meidrt, value)
110         }*/
111
112         //rawrt = append(rawrt, meidrt)
113         xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt)
114         xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rcs)
115         return &rawrt
116 }
117
118 /*
119 Produces the raw route message consumable by RMR
120 */
121 func (r *Rmr) generatePartialRMRPolicies(eps rtmgr.Endpoints, xappSubData *models.XappSubscriptionData, key string, updatetype rtmgr.RMRUpdateType) *[]string {
122         rawrt := []string{key + "updatert|start\n"}
123         rt := r.generatePartialRouteTable(eps, xappSubData, updatetype)
124         for _, rte := range *rt {
125                 rawrte := key + "mse|" + rte.MessageType
126                 for _, tx := range rte.TxList {
127                         rawrte += "," + tx.Ip + ":" + strconv.Itoa(int(tx.Port))
128                 }
129                 rawrte += "|" + strconv.Itoa(int(rte.SubID)) + "|"
130                 group := ""
131                 for _, rxg := range rte.RxGroups {
132                         member := ""
133                         for _, rx := range rxg {
134                                 if member == "" {
135                                         member += rx.Ip + ":" + strconv.Itoa(int(rx.Port))
136                                 } else {
137                                         member += "," + rx.Ip + ":" + strconv.Itoa(int(rx.Port))
138                                 }
139                         }
140                         if group == "" {
141                                 group += member
142                         } else {
143                                 group += ";" + member
144                         }
145                 }
146                 rawrte += group
147
148                 if rte.RouteType == "%meid" {
149                         rawrte += group + rte.RouteType
150                 }
151
152                 rawrt = append(rawrt, rawrte+"\n")
153         }
154
155         rawrt = append(rawrt, key+"updatert|end\n")
156         //count := 0
157
158         xapp.Logger.Debug("rmr.GeneratePolicies returns: %v", rawrt)
159         return &rawrt
160 }
161 func (r *RmrPush) GeneratePolicies(eps rtmgr.Endpoints, rcs *rtmgr.RicComponents) *[]string {
162         xapp.Logger.Debug("Invoked rmr.GeneratePolicies, args: %v: ", eps)
163         return r.generateRMRPolicies(eps, rcs, "")
164 }
165
166 func (r *RmrPush) GenerateRouteTable(eps rtmgr.Endpoints) *rtmgr.RouteTable {
167         return r.generateRouteTable(eps)
168 }
169
170 func (r *RmrPush) GeneratePartialPolicies(eps rtmgr.Endpoints, xappSubData *models.XappSubscriptionData, updatetype rtmgr.RMRUpdateType) *[]string {
171         xapp.Logger.Debug("Invoked rmr.GeneratePartialRMR, args: %v: ", eps)
172         return r.generatePartialRMRPolicies(eps, xappSubData, "", updatetype)
173 }