blob: 72a210056efaf6f97d04f9cc779261ffad13ba12 [file] [log] [blame]
kalnagy45114752019-06-18 14:40:39 +02001/*
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
20package control
21
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020022import (
Anssi Mannilab73e7cd2021-08-03 11:57:11 +030023 "encoding/json"
Juha Hyttinen0388dd92020-01-09 14:14:16 +020024 "fmt"
archaggeafbf95f2021-04-14 08:54:05 +030025 "sync"
26 "time"
27
Juha Hyttinen422d0182020-01-17 13:37:05 +020028 "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +020029 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020030 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020031)
32
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020033//-----------------------------------------------------------------------------
34//
35//-----------------------------------------------------------------------------
Juha Hyttinen83ada002020-01-30 10:36:33 +020036
archaggeafbf95f2021-04-14 08:54:05 +030037type RESTSubscription struct {
38 xAppRmrEndPoint string
39 Meid string
40 InstanceIds []uint32
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000041 xAppIdToE2Id map[int64]int64
archaggeafbf95f2021-04-14 08:54:05 +030042 SubReqOngoing bool
43 SubDelReqOngoing bool
Markku Virtanen42723e22021-06-15 10:09:23 +030044 lastReqMd5sum string
archaggeafbf95f2021-04-14 08:54:05 +030045}
46
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000047func (r *RESTSubscription) AddE2InstanceId(instanceId uint32) {
Markku Virtanen42723e22021-06-15 10:09:23 +030048
49 for _, v := range r.InstanceIds {
50 if v == instanceId {
51 return
52 }
53
54 }
55
archaggeafbf95f2021-04-14 08:54:05 +030056 r.InstanceIds = append(r.InstanceIds, instanceId)
57}
58
Markku Virtanen42723e22021-06-15 10:09:23 +030059func (r *RESTSubscription) AddMd5Sum(md5sum string) {
60 if md5sum != "" {
61 r.lastReqMd5sum = md5sum
62 } else {
63 xapp.Logger.Error("EMPTY md5sum attempted to be add to subscrition")
64 }
65}
66
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000067func (r *RESTSubscription) DeleteE2InstanceId(instanceId uint32) {
68 r.InstanceIds = r.InstanceIds[1:]
69}
70
71func (r *RESTSubscription) AddXappIdToE2Id(xAppEventInstanceID int64, e2EventInstanceID int64) {
72 r.xAppIdToE2Id[xAppEventInstanceID] = e2EventInstanceID
73}
74
75func (r *RESTSubscription) GetE2IdFromXappIdToE2Id(xAppEventInstanceID int64) int64 {
76 return r.xAppIdToE2Id[xAppEventInstanceID]
77}
78
79func (r *RESTSubscription) DeleteXappIdToE2Id(xAppEventInstanceID int64) {
80 delete(r.xAppIdToE2Id, xAppEventInstanceID)
81}
82
Markku Virtanen42723e22021-06-15 10:09:23 +030083func (r *RESTSubscription) SetProcessed(err error) {
archaggeafbf95f2021-04-14 08:54:05 +030084 r.SubReqOngoing = false
Markku Virtanen42723e22021-06-15 10:09:23 +030085 if err != nil {
86 r.lastReqMd5sum = ""
87 }
archaggeafbf95f2021-04-14 08:54:05 +030088}
89
kalnagy45114752019-06-18 14:40:39 +020090type Registry struct {
archaggeafbf95f2021-04-14 08:54:05 +030091 mutex sync.Mutex
92 register map[uint32]*Subscription
93 subIds []uint32
94 rtmgrClient *RtmgrClient
95 restSubscriptions map[string]*RESTSubscription
kalnagy45114752019-06-18 14:40:39 +020096}
97
Anssi Mannila5c161a92020-01-15 15:40:57 +020098func (r *Registry) Initialize() {
Juha Hyttinen83ada002020-01-30 10:36:33 +020099 r.register = make(map[uint32]*Subscription)
archaggeafbf95f2021-04-14 08:54:05 +0300100 r.restSubscriptions = make(map[string]*RESTSubscription)
101
Juha Hyttinen83ada002020-01-30 10:36:33 +0200102 var i uint32
Anssi Mannilac92b4212020-12-07 14:59:34 +0200103 for i = 1; i < 65535; i++ {
104 r.subIds = append(r.subIds, i)
Anssi Mannila5c161a92020-01-15 15:40:57 +0200105 }
kalnagy45114752019-06-18 14:40:39 +0200106}
107
Anssi Mannilab73e7cd2021-08-03 11:57:11 +0300108func (r *Registry) GetAllRestSubscriptions() []byte {
109 r.mutex.Lock()
110 defer r.mutex.Unlock()
111 restSubscriptionsJson, err := json.Marshal(r.restSubscriptions)
112 if err != nil {
113 xapp.Logger.Error("GetAllRestSubscriptions(): %v", err)
114 }
115 return restSubscriptionsJson
116}
117
archaggeafbf95f2021-04-14 08:54:05 +0300118func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *string, maid *string) (*RESTSubscription, error) {
119 r.mutex.Lock()
120 defer r.mutex.Unlock()
121 newRestSubscription := RESTSubscription{}
122 newRestSubscription.xAppRmrEndPoint = *xAppRmrEndPoint
123 newRestSubscription.Meid = *maid
124 newRestSubscription.SubReqOngoing = true
125 newRestSubscription.SubDelReqOngoing = false
126 r.restSubscriptions[*restSubId] = &newRestSubscription
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000127 newRestSubscription.xAppIdToE2Id = make(map[int64]int64)
Anssi Mannila316d8a12021-06-02 11:08:54 +0300128 xapp.Logger.Info("Registry: Created REST subscription successfully. restSubId=%v, subscriptionCount=%v, e2apSubscriptionCount=%v", *restSubId, len(r.restSubscriptions), len(r.register))
archaggeafbf95f2021-04-14 08:54:05 +0300129 return &newRestSubscription, nil
130}
131
132func (r *Registry) DeleteRESTSubscription(restSubId *string) {
133 r.mutex.Lock()
134 defer r.mutex.Unlock()
135 delete(r.restSubscriptions, *restSubId)
136 xapp.Logger.Info("Registry: Deleted REST subscription successfully. restSubId=%v, subscriptionCount=%v", *restSubId, len(r.restSubscriptions))
137}
138
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000139func (r *Registry) GetRESTSubscription(restSubId string, IsDelReqOngoing bool) (*RESTSubscription, error) {
archaggeafbf95f2021-04-14 08:54:05 +0300140 r.mutex.Lock()
141 defer r.mutex.Unlock()
142 if restSubscription, ok := r.restSubscriptions[restSubId]; ok {
143 // Subscription deletion is not allowed if prosessing subscription request in not ready
144 if restSubscription.SubDelReqOngoing == false && restSubscription.SubReqOngoing == false {
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000145 if IsDelReqOngoing == true {
146 restSubscription.SubDelReqOngoing = true
147 }
archaggeafbf95f2021-04-14 08:54:05 +0300148 r.restSubscriptions[restSubId] = restSubscription
149 return restSubscription, nil
150 } else {
Markku Virtanenda34eec2021-05-20 08:22:04 +0000151 return restSubscription, fmt.Errorf("Registry: REST request is still ongoing for the endpoint=%v, restSubId=%v, SubDelReqOngoing=%v, SubReqOngoing=%v", restSubscription, restSubId, restSubscription.SubDelReqOngoing, restSubscription.SubReqOngoing)
archaggeafbf95f2021-04-14 08:54:05 +0300152 }
153 return restSubscription, nil
154 }
155 return nil, fmt.Errorf("Registry: No valid subscription found with restSubId=%v", restSubId)
156}
157
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200158func (r *Registry) QueryHandler() (models.SubscriptionList, error) {
159 r.mutex.Lock()
160 defer r.mutex.Unlock()
161
162 resp := models.SubscriptionList{}
163 for _, subs := range r.register {
164 subs.mutex.Lock()
archaggea5c58bc2021-04-14 08:54:05 +0300165 resp = append(resp, &models.SubscriptionData{SubscriptionID: int64(subs.ReqId.InstanceId), Meid: subs.Meid.RanName, ClientEndpoint: subs.EpList.StringList()})
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200166 subs.mutex.Unlock()
167 }
168 return resp, nil
169}
170
Anssi Mannilac92b4212020-12-07 14:59:34 +0200171func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool) (*Subscription, error) {
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200172 if len(r.subIds) > 0 {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300173 subId := r.subIds[0]
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200174 r.subIds = r.subIds[1:]
Juha Hyttinenaada6452020-04-07 08:47:58 +0300175 if _, ok := r.register[subId]; ok == true {
176 r.subIds = append(r.subIds, subId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200177 return nil, fmt.Errorf("Registry: Failed to reserve subscription exists")
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200178 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200179 subs := &Subscription{
Anssi Mannilac92b4212020-12-07 14:59:34 +0200180 registry: r,
181 Meid: trans.Meid,
182 SubReqMsg: subReqMsg,
183 valid: true,
184 RetryFromXapp: false,
185 SubRespRcvd: false,
186 DeleteFromDb: false,
187 NoRespToXapp: false,
188 DoNotWaitSubResp: false,
Juha Hyttinen3944a222020-01-24 11:51:46 +0200189 }
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000190 subs.ReqId.Id = subReqMsg.RequestId.Id
Juha Hyttinenaada6452020-04-07 08:47:58 +0300191 subs.ReqId.InstanceId = subId
Anssi Mannilac92b4212020-12-07 14:59:34 +0200192 if resetTestFlag == true {
193 subs.DoNotWaitSubResp = true
194 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200195
196 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300197 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200198 return nil, fmt.Errorf("Registry: Endpoint existing already in subscription")
199 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200200 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200201 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200202 return nil, fmt.Errorf("Registry: Failed to reserve subscription no free ids")
203}
204
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200205func (r *Registry) findExistingSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest) (*Subscription, bool) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200206
Juha Hyttinen3944a222020-01-24 11:51:46 +0200207 for _, subs := range r.register {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200208 if subs.IsMergeable(trans, subReqMsg) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200209
210 //
211 // check if there has been race conditions
212 //
213 subs.mutex.Lock()
214 //subs has been set to invalid
215 if subs.valid == false {
216 subs.mutex.Unlock()
217 continue
218 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200219 // If size is zero, entry is to be deleted
220 if subs.EpList.Size() == 0 {
221 subs.mutex.Unlock()
222 continue
223 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200224 // Try to add to endpointlist. Adding fails if endpoint is already in the list
Juha Hyttinen3944a222020-01-24 11:51:46 +0200225 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
226 subs.mutex.Unlock()
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200227 xapp.Logger.Debug("Registry: Subs with requesting endpoint found. %s for %s", subs.String(), trans.String())
228 return subs, true
Juha Hyttinen3944a222020-01-24 11:51:46 +0200229 }
230 subs.mutex.Unlock()
231
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200232 xapp.Logger.Debug("Registry: Mergeable subs found. %s for %s", subs.String(), trans.String())
233 return subs, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200234 }
235 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200236 return nil, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200237}
238
Anssi Mannila4abf1802021-01-28 13:06:46 +0200239func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, c *Control) (*Subscription, error) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200240 var err error
241 var newAlloc bool
242 r.mutex.Lock()
243 defer r.mutex.Unlock()
244
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200245 //
246 // Check validity of subscription action types
247 //
248 actionType, err := r.CheckActionTypes(subReqMsg)
249 if err != nil {
Markku Virtanen55d2a282021-06-04 14:46:56 +0300250 xapp.Logger.Info("CREATE %s", err)
251 err = fmt.Errorf("E2 content validation failed")
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200252 return nil, err
253 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200254
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200255 //
256 // Find possible existing Policy subscription
257 //
258 if actionType == e2ap.E2AP_ActionTypePolicy {
Juha Hyttinen47942b42020-02-27 10:41:43 +0200259 if subs, ok := r.register[trans.GetSubId()]; ok {
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200260 xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found.", subs.String())
Anssi Mannilacc7d9e02020-04-08 12:58:53 +0300261 // Update message data to subscription
262 subs.SubReqMsg = subReqMsg
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200263 subs.SetCachedResponse(nil, true)
264 return subs, nil
265 }
266 }
267
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200268 subs, endPointFound := r.findExistingSubs(trans, subReqMsg)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200269 if subs == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200270 if subs, err = r.allocateSubs(trans, subReqMsg, resetTestFlag); err != nil {
Markku Virtanen55d2a282021-06-04 14:46:56 +0300271 xapp.Logger.Error("%s", err.Error())
272 err = fmt.Errorf("subscription not allocated")
Juha Hyttinen3944a222020-01-24 11:51:46 +0200273 return nil, err
274 }
275 newAlloc = true
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200276 } else if endPointFound == true {
277 // Requesting endpoint is already present in existing subscription. This can happen if xApp is restarted.
Anssi Mannilac92b4212020-12-07 14:59:34 +0200278 subs.RetryFromXapp = true
Anssi Mannila316d8a12021-06-02 11:08:54 +0300279 xapp.Logger.Debug("CREATE subReqMsg.InstanceId=%v. Same subscription %s already exists.", subReqMsg.InstanceId, subs.String())
280 c.UpdateCounter(cDuplicateE2SubReq)
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200281 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200282 }
283
284 //
285 // Add to subscription
286 //
287 subs.mutex.Lock()
288 defer subs.mutex.Unlock()
289
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200290 epamount := subs.EpList.Size()
Anssi Mannila316d8a12021-06-02 11:08:54 +0300291 xapp.Logger.Info("AssignToSubscription subs.EpList.Size()=%v", subs.EpList.Size())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200292
293 r.mutex.Unlock()
294 //
295 // Subscription route updates
296 //
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200297 if epamount == 1 {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200298 err = r.RouteCreate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200299 } else {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200300 err = r.RouteCreateUpdate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200301 }
302 r.mutex.Lock()
303
304 if err != nil {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200305 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300306 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200307 }
Anssi Mannila4abf1802021-01-28 13:06:46 +0200308 // Delete already added endpoint for the request
309 subs.EpList.DelEndpoint(trans.GetEndpoint())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200310 return nil, err
311 }
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200312
Juha Hyttinen3944a222020-01-24 11:51:46 +0200313 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300314 r.register[subs.ReqId.InstanceId] = subs
Juha Hyttinen3944a222020-01-24 11:51:46 +0200315 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200316 xapp.Logger.Debug("CREATE %s", subs.String())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200317 xapp.Logger.Debug("Registry: substable=%v", r.register)
318 return subs, nil
319}
320
Anssi Mannila4abf1802021-01-28 13:06:46 +0200321func (r *Registry) RouteCreate(subs *Subscription, c *Control) error {
322 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
323 err := r.rtmgrClient.SubscriptionRequestCreate(subRouteAction)
324 if err != nil {
325 c.UpdateCounter(cRouteCreateFail)
Markku Virtanen55d2a282021-06-04 14:46:56 +0300326 xapp.Logger.Error("%s", err.Error())
327 err = fmt.Errorf("RTMGR route create failure")
Anssi Mannila4abf1802021-01-28 13:06:46 +0200328 }
329 return err
330}
331
332func (r *Registry) RouteCreateUpdate(subs *Subscription, c *Control) error {
333 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
334 err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
335 if err != nil {
336 c.UpdateCounter(cRouteCreateUpdateFail)
Markku Virtanen55d2a282021-06-04 14:46:56 +0300337 xapp.Logger.Error("%s", err.Error())
338 err = fmt.Errorf("RTMGR route update failure")
Anssi Mannila4abf1802021-01-28 13:06:46 +0200339 return err
340 }
341 c.UpdateCounter(cMergedSubscriptions)
342 return err
343}
344
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200345func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) {
346 var reportFound bool = false
347 var policyFound bool = false
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300348 var insertFound bool = false
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200349
350 for _, acts := range subReqMsg.ActionSetups {
351 if acts.ActionType == e2ap.E2AP_ActionTypeReport {
352 reportFound = true
353 }
354 if acts.ActionType == e2ap.E2AP_ActionTypePolicy {
355 policyFound = true
356 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300357 if acts.ActionType == e2ap.E2AP_ActionTypeInsert {
358 insertFound = true
359 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200360 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300361 if reportFound == true && policyFound == true || reportFound == true && insertFound == true || policyFound == true && insertFound == true {
362 return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Different action types (Report, Policy or Insert) in same RICactions-ToBeSetup-List")
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200363 }
364 if reportFound == true {
365 return e2ap.E2AP_ActionTypeReport, nil
366 }
367 if policyFound == true {
368 return e2ap.E2AP_ActionTypePolicy, nil
369 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300370 if insertFound == true {
371 return e2ap.E2AP_ActionTypeInsert, nil
372 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200373 return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Invalid action type in RICactions-ToBeSetup-List")
374}
375
Juha Hyttinen83ada002020-01-30 10:36:33 +0200376// TODO: Works with concurrent calls, but check if can be improved
Anssi Mannilac92b4212020-12-07 14:59:34 +0200377func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *TransactionXapp, waitRouteClean time.Duration, c *Control) error {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200378
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200379 r.mutex.Lock()
380 defer r.mutex.Unlock()
381 subs.mutex.Lock()
382 defer subs.mutex.Unlock()
383
384 delStatus := subs.EpList.DelEndpoint(trans.GetEndpoint())
385 epamount := subs.EpList.Size()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300386 subId := subs.ReqId.InstanceId
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200387
Juha Hyttinen83ada002020-01-30 10:36:33 +0200388 if delStatus == false {
389 return nil
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200390 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200391
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200392 go func() {
393 if waitRouteClean > 0 {
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000394 xapp.Logger.Debug("Pending %v in order to wait route cleanup", waitRouteClean)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200395 time.Sleep(waitRouteClean)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200396 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200397
398 subs.mutex.Lock()
399 defer subs.mutex.Unlock()
400 xapp.Logger.Info("CLEAN %s", subs.String())
401
402 if epamount == 0 {
403 //
404 // Subscription route delete
405 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200406 r.RouteDelete(subs, trans, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200407
408 //
409 // Subscription release
410 //
411 r.mutex.Lock()
412 defer r.mutex.Unlock()
413
Juha Hyttinenaada6452020-04-07 08:47:58 +0300414 if _, ok := r.register[subId]; ok {
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200415 xapp.Logger.Debug("RELEASE %s", subs.String())
Juha Hyttinenaada6452020-04-07 08:47:58 +0300416 delete(r.register, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200417 xapp.Logger.Debug("Registry: substable=%v", r.register)
418 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300419 r.subIds = append(r.subIds, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200420 } else if subs.EpList.Size() > 0 {
421 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200422 // Subscription route update
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200423 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200424 r.RouteDeleteUpdate(subs, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200425 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200426 }()
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200427
428 return nil
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200429}
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200430
Anssi Mannila4abf1802021-01-28 13:06:46 +0200431func (r *Registry) RouteDelete(subs *Subscription, trans *TransactionXapp, c *Control) {
432 tmpList := xapp.RmrEndpointList{}
433 tmpList.AddEndpoint(trans.GetEndpoint())
434 subRouteAction := SubRouteInfo{tmpList, uint16(subs.ReqId.InstanceId)}
435 if err := r.rtmgrClient.SubscriptionRequestDelete(subRouteAction); err != nil {
436 c.UpdateCounter(cRouteDeleteFail)
437 }
438}
439
440func (r *Registry) RouteDeleteUpdate(subs *Subscription, c *Control) {
441 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
442 if err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction); err != nil {
443 c.UpdateCounter(cRouteDeleteUpdateFail)
444 }
445}
446
Anssi Mannilac92b4212020-12-07 14:59:34 +0200447func (r *Registry) UpdateSubscriptionToDb(subs *Subscription, c *Control) {
448 r.mutex.Lock()
449 defer r.mutex.Unlock()
450 subs.mutex.Lock()
451 defer subs.mutex.Unlock()
452
453 epamount := subs.EpList.Size()
454 if epamount == 0 {
455 if _, ok := r.register[subs.ReqId.InstanceId]; ok {
456 // Not merged subscription is being deleted
457 c.RemoveSubscriptionFromDb(subs)
458
459 }
460 } else if subs.EpList.Size() > 0 {
461 // Endpoint of merged subscription is being deleted
462 c.WriteSubscriptionToDb(subs)
Anssi Mannila4abf1802021-01-28 13:06:46 +0200463 c.UpdateCounter(cUnmergedSubscriptions)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200464 }
465}
466
Juha Hyttinenaada6452020-04-07 08:47:58 +0300467func (r *Registry) GetSubscription(subId uint32) *Subscription {
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200468 r.mutex.Lock()
469 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300470 if _, ok := r.register[subId]; ok {
471 return r.register[subId]
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200472 }
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200473 return nil
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000474}
475
Juha Hyttinenaada6452020-04-07 08:47:58 +0300476func (r *Registry) GetSubscriptionFirstMatch(subIds []uint32) (*Subscription, error) {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200477 r.mutex.Lock()
478 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300479 for _, subId := range subIds {
480 if _, ok := r.register[subId]; ok {
481 return r.register[subId], nil
Juha Hyttinen422d0182020-01-17 13:37:05 +0200482 }
483 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300484 return nil, fmt.Errorf("No valid subscription found with subIds %v", subIds)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200485}