blob: 2495d3b9ba249786977dd385d482441975de26a0 [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 (
Juha Hyttinen0388dd92020-01-09 14:14:16 +020023 "fmt"
archaggeafbf95f2021-04-14 08:54:05 +030024 "sync"
25 "time"
26
Juha Hyttinen422d0182020-01-17 13:37:05 +020027 "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +020028 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020029 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020030)
31
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020032//-----------------------------------------------------------------------------
33//
34//-----------------------------------------------------------------------------
Juha Hyttinen83ada002020-01-30 10:36:33 +020035
archaggeafbf95f2021-04-14 08:54:05 +030036type RESTSubscription struct {
37 xAppRmrEndPoint string
38 Meid string
39 InstanceIds []uint32
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000040 xAppIdToE2Id map[int64]int64
archaggeafbf95f2021-04-14 08:54:05 +030041 SubReqOngoing bool
42 SubDelReqOngoing bool
Markku Virtanen42723e22021-06-15 10:09:23 +030043 lastReqMd5sum string
archaggeafbf95f2021-04-14 08:54:05 +030044}
45
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000046func (r *RESTSubscription) AddE2InstanceId(instanceId uint32) {
Markku Virtanen42723e22021-06-15 10:09:23 +030047
48 for _, v := range r.InstanceIds {
49 if v == instanceId {
50 return
51 }
52
53 }
54
archaggeafbf95f2021-04-14 08:54:05 +030055 r.InstanceIds = append(r.InstanceIds, instanceId)
56}
57
Markku Virtanen42723e22021-06-15 10:09:23 +030058func (r *RESTSubscription) AddMd5Sum(md5sum string) {
59 if md5sum != "" {
60 r.lastReqMd5sum = md5sum
61 } else {
62 xapp.Logger.Error("EMPTY md5sum attempted to be add to subscrition")
63 }
64}
65
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000066func (r *RESTSubscription) DeleteE2InstanceId(instanceId uint32) {
67 r.InstanceIds = r.InstanceIds[1:]
68}
69
70func (r *RESTSubscription) AddXappIdToE2Id(xAppEventInstanceID int64, e2EventInstanceID int64) {
71 r.xAppIdToE2Id[xAppEventInstanceID] = e2EventInstanceID
72}
73
74func (r *RESTSubscription) GetE2IdFromXappIdToE2Id(xAppEventInstanceID int64) int64 {
75 return r.xAppIdToE2Id[xAppEventInstanceID]
76}
77
78func (r *RESTSubscription) DeleteXappIdToE2Id(xAppEventInstanceID int64) {
79 delete(r.xAppIdToE2Id, xAppEventInstanceID)
80}
81
Markku Virtanen42723e22021-06-15 10:09:23 +030082func (r *RESTSubscription) SetProcessed(err error) {
archaggeafbf95f2021-04-14 08:54:05 +030083 r.SubReqOngoing = false
Markku Virtanen42723e22021-06-15 10:09:23 +030084 if err != nil {
85 r.lastReqMd5sum = ""
86 }
archaggeafbf95f2021-04-14 08:54:05 +030087}
88
kalnagy45114752019-06-18 14:40:39 +020089type Registry struct {
archaggeafbf95f2021-04-14 08:54:05 +030090 mutex sync.Mutex
91 register map[uint32]*Subscription
92 subIds []uint32
93 rtmgrClient *RtmgrClient
94 restSubscriptions map[string]*RESTSubscription
kalnagy45114752019-06-18 14:40:39 +020095}
96
Anssi Mannila5c161a92020-01-15 15:40:57 +020097func (r *Registry) Initialize() {
Juha Hyttinen83ada002020-01-30 10:36:33 +020098 r.register = make(map[uint32]*Subscription)
archaggeafbf95f2021-04-14 08:54:05 +030099 r.restSubscriptions = make(map[string]*RESTSubscription)
100
Juha Hyttinen83ada002020-01-30 10:36:33 +0200101 var i uint32
Anssi Mannilac92b4212020-12-07 14:59:34 +0200102 for i = 1; i < 65535; i++ {
103 r.subIds = append(r.subIds, i)
Anssi Mannila5c161a92020-01-15 15:40:57 +0200104 }
kalnagy45114752019-06-18 14:40:39 +0200105}
106
archaggeafbf95f2021-04-14 08:54:05 +0300107func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *string, maid *string) (*RESTSubscription, error) {
108 r.mutex.Lock()
109 defer r.mutex.Unlock()
110 newRestSubscription := RESTSubscription{}
111 newRestSubscription.xAppRmrEndPoint = *xAppRmrEndPoint
112 newRestSubscription.Meid = *maid
113 newRestSubscription.SubReqOngoing = true
114 newRestSubscription.SubDelReqOngoing = false
115 r.restSubscriptions[*restSubId] = &newRestSubscription
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000116 newRestSubscription.xAppIdToE2Id = make(map[int64]int64)
Anssi Mannila316d8a12021-06-02 11:08:54 +0300117 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 +0300118 return &newRestSubscription, nil
119}
120
121func (r *Registry) DeleteRESTSubscription(restSubId *string) {
122 r.mutex.Lock()
123 defer r.mutex.Unlock()
124 delete(r.restSubscriptions, *restSubId)
125 xapp.Logger.Info("Registry: Deleted REST subscription successfully. restSubId=%v, subscriptionCount=%v", *restSubId, len(r.restSubscriptions))
126}
127
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000128func (r *Registry) GetRESTSubscription(restSubId string, IsDelReqOngoing bool) (*RESTSubscription, error) {
archaggeafbf95f2021-04-14 08:54:05 +0300129 r.mutex.Lock()
130 defer r.mutex.Unlock()
131 if restSubscription, ok := r.restSubscriptions[restSubId]; ok {
132 // Subscription deletion is not allowed if prosessing subscription request in not ready
133 if restSubscription.SubDelReqOngoing == false && restSubscription.SubReqOngoing == false {
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000134 if IsDelReqOngoing == true {
135 restSubscription.SubDelReqOngoing = true
136 }
archaggeafbf95f2021-04-14 08:54:05 +0300137 r.restSubscriptions[restSubId] = restSubscription
138 return restSubscription, nil
139 } else {
Markku Virtanenda34eec2021-05-20 08:22:04 +0000140 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 +0300141 }
142 return restSubscription, nil
143 }
144 return nil, fmt.Errorf("Registry: No valid subscription found with restSubId=%v", restSubId)
145}
146
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200147func (r *Registry) QueryHandler() (models.SubscriptionList, error) {
148 r.mutex.Lock()
149 defer r.mutex.Unlock()
150
151 resp := models.SubscriptionList{}
152 for _, subs := range r.register {
153 subs.mutex.Lock()
archaggea5c58bc2021-04-14 08:54:05 +0300154 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 +0200155 subs.mutex.Unlock()
156 }
157 return resp, nil
158}
159
Anssi Mannilac92b4212020-12-07 14:59:34 +0200160func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool) (*Subscription, error) {
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200161 if len(r.subIds) > 0 {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300162 subId := r.subIds[0]
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200163 r.subIds = r.subIds[1:]
Juha Hyttinenaada6452020-04-07 08:47:58 +0300164 if _, ok := r.register[subId]; ok == true {
165 r.subIds = append(r.subIds, subId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200166 return nil, fmt.Errorf("Registry: Failed to reserve subscription exists")
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200167 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200168 subs := &Subscription{
Anssi Mannilac92b4212020-12-07 14:59:34 +0200169 registry: r,
170 Meid: trans.Meid,
171 SubReqMsg: subReqMsg,
172 valid: true,
173 RetryFromXapp: false,
174 SubRespRcvd: false,
175 DeleteFromDb: false,
176 NoRespToXapp: false,
177 DoNotWaitSubResp: false,
Juha Hyttinen3944a222020-01-24 11:51:46 +0200178 }
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000179 subs.ReqId.Id = subReqMsg.RequestId.Id
Juha Hyttinenaada6452020-04-07 08:47:58 +0300180 subs.ReqId.InstanceId = subId
Anssi Mannilac92b4212020-12-07 14:59:34 +0200181 if resetTestFlag == true {
182 subs.DoNotWaitSubResp = true
183 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200184
185 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300186 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200187 return nil, fmt.Errorf("Registry: Endpoint existing already in subscription")
188 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200189 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200190 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200191 return nil, fmt.Errorf("Registry: Failed to reserve subscription no free ids")
192}
193
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200194func (r *Registry) findExistingSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest) (*Subscription, bool) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200195
Juha Hyttinen3944a222020-01-24 11:51:46 +0200196 for _, subs := range r.register {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200197 if subs.IsMergeable(trans, subReqMsg) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200198
199 //
200 // check if there has been race conditions
201 //
202 subs.mutex.Lock()
203 //subs has been set to invalid
204 if subs.valid == false {
205 subs.mutex.Unlock()
206 continue
207 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200208 // If size is zero, entry is to be deleted
209 if subs.EpList.Size() == 0 {
210 subs.mutex.Unlock()
211 continue
212 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200213 // Try to add to endpointlist. Adding fails if endpoint is already in the list
Juha Hyttinen3944a222020-01-24 11:51:46 +0200214 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
215 subs.mutex.Unlock()
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200216 xapp.Logger.Debug("Registry: Subs with requesting endpoint found. %s for %s", subs.String(), trans.String())
217 return subs, true
Juha Hyttinen3944a222020-01-24 11:51:46 +0200218 }
219 subs.mutex.Unlock()
220
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200221 xapp.Logger.Debug("Registry: Mergeable subs found. %s for %s", subs.String(), trans.String())
222 return subs, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200223 }
224 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200225 return nil, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200226}
227
Anssi Mannila4abf1802021-01-28 13:06:46 +0200228func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, c *Control) (*Subscription, error) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200229 var err error
230 var newAlloc bool
231 r.mutex.Lock()
232 defer r.mutex.Unlock()
233
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200234 //
235 // Check validity of subscription action types
236 //
237 actionType, err := r.CheckActionTypes(subReqMsg)
238 if err != nil {
Markku Virtanen55d2a282021-06-04 14:46:56 +0300239 xapp.Logger.Info("CREATE %s", err)
240 err = fmt.Errorf("E2 content validation failed")
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200241 return nil, err
242 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200243
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200244 //
245 // Find possible existing Policy subscription
246 //
247 if actionType == e2ap.E2AP_ActionTypePolicy {
Juha Hyttinen47942b42020-02-27 10:41:43 +0200248 if subs, ok := r.register[trans.GetSubId()]; ok {
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200249 xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found.", subs.String())
Anssi Mannilacc7d9e02020-04-08 12:58:53 +0300250 // Update message data to subscription
251 subs.SubReqMsg = subReqMsg
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200252 subs.SetCachedResponse(nil, true)
253 return subs, nil
254 }
255 }
256
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200257 subs, endPointFound := r.findExistingSubs(trans, subReqMsg)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200258 if subs == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200259 if subs, err = r.allocateSubs(trans, subReqMsg, resetTestFlag); err != nil {
Markku Virtanen55d2a282021-06-04 14:46:56 +0300260 xapp.Logger.Error("%s", err.Error())
261 err = fmt.Errorf("subscription not allocated")
Juha Hyttinen3944a222020-01-24 11:51:46 +0200262 return nil, err
263 }
264 newAlloc = true
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200265 } else if endPointFound == true {
266 // Requesting endpoint is already present in existing subscription. This can happen if xApp is restarted.
Anssi Mannilac92b4212020-12-07 14:59:34 +0200267 subs.RetryFromXapp = true
Anssi Mannila316d8a12021-06-02 11:08:54 +0300268 xapp.Logger.Debug("CREATE subReqMsg.InstanceId=%v. Same subscription %s already exists.", subReqMsg.InstanceId, subs.String())
269 c.UpdateCounter(cDuplicateE2SubReq)
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200270 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200271 }
272
273 //
274 // Add to subscription
275 //
276 subs.mutex.Lock()
277 defer subs.mutex.Unlock()
278
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200279 epamount := subs.EpList.Size()
Anssi Mannila316d8a12021-06-02 11:08:54 +0300280 xapp.Logger.Info("AssignToSubscription subs.EpList.Size()=%v", subs.EpList.Size())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200281
282 r.mutex.Unlock()
283 //
284 // Subscription route updates
285 //
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200286 if epamount == 1 {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200287 err = r.RouteCreate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200288 } else {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200289 err = r.RouteCreateUpdate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200290 }
291 r.mutex.Lock()
292
293 if err != nil {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200294 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300295 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200296 }
Anssi Mannila4abf1802021-01-28 13:06:46 +0200297 // Delete already added endpoint for the request
298 subs.EpList.DelEndpoint(trans.GetEndpoint())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200299 return nil, err
300 }
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200301
Juha Hyttinen3944a222020-01-24 11:51:46 +0200302 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300303 r.register[subs.ReqId.InstanceId] = subs
Juha Hyttinen3944a222020-01-24 11:51:46 +0200304 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200305 xapp.Logger.Debug("CREATE %s", subs.String())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200306 xapp.Logger.Debug("Registry: substable=%v", r.register)
307 return subs, nil
308}
309
Anssi Mannila4abf1802021-01-28 13:06:46 +0200310func (r *Registry) RouteCreate(subs *Subscription, c *Control) error {
311 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
312 err := r.rtmgrClient.SubscriptionRequestCreate(subRouteAction)
313 if err != nil {
314 c.UpdateCounter(cRouteCreateFail)
Markku Virtanen55d2a282021-06-04 14:46:56 +0300315 xapp.Logger.Error("%s", err.Error())
316 err = fmt.Errorf("RTMGR route create failure")
Anssi Mannila4abf1802021-01-28 13:06:46 +0200317 }
318 return err
319}
320
321func (r *Registry) RouteCreateUpdate(subs *Subscription, c *Control) error {
322 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
323 err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
324 if err != nil {
325 c.UpdateCounter(cRouteCreateUpdateFail)
Markku Virtanen55d2a282021-06-04 14:46:56 +0300326 xapp.Logger.Error("%s", err.Error())
327 err = fmt.Errorf("RTMGR route update failure")
Anssi Mannila4abf1802021-01-28 13:06:46 +0200328 return err
329 }
330 c.UpdateCounter(cMergedSubscriptions)
331 return err
332}
333
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200334func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) {
335 var reportFound bool = false
336 var policyFound bool = false
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300337 var insertFound bool = false
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200338
339 for _, acts := range subReqMsg.ActionSetups {
340 if acts.ActionType == e2ap.E2AP_ActionTypeReport {
341 reportFound = true
342 }
343 if acts.ActionType == e2ap.E2AP_ActionTypePolicy {
344 policyFound = true
345 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300346 if acts.ActionType == e2ap.E2AP_ActionTypeInsert {
347 insertFound = true
348 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200349 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300350 if reportFound == true && policyFound == true || reportFound == true && insertFound == true || policyFound == true && insertFound == true {
351 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 +0200352 }
353 if reportFound == true {
354 return e2ap.E2AP_ActionTypeReport, nil
355 }
356 if policyFound == true {
357 return e2ap.E2AP_ActionTypePolicy, nil
358 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300359 if insertFound == true {
360 return e2ap.E2AP_ActionTypeInsert, nil
361 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200362 return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Invalid action type in RICactions-ToBeSetup-List")
363}
364
Juha Hyttinen83ada002020-01-30 10:36:33 +0200365// TODO: Works with concurrent calls, but check if can be improved
Anssi Mannilac92b4212020-12-07 14:59:34 +0200366func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *TransactionXapp, waitRouteClean time.Duration, c *Control) error {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200367
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200368 r.mutex.Lock()
369 defer r.mutex.Unlock()
370 subs.mutex.Lock()
371 defer subs.mutex.Unlock()
372
373 delStatus := subs.EpList.DelEndpoint(trans.GetEndpoint())
374 epamount := subs.EpList.Size()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300375 subId := subs.ReqId.InstanceId
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200376
Juha Hyttinen83ada002020-01-30 10:36:33 +0200377 if delStatus == false {
378 return nil
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200379 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200380
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200381 go func() {
382 if waitRouteClean > 0 {
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000383 xapp.Logger.Debug("Pending %v in order to wait route cleanup", waitRouteClean)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200384 time.Sleep(waitRouteClean)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200385 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200386
387 subs.mutex.Lock()
388 defer subs.mutex.Unlock()
389 xapp.Logger.Info("CLEAN %s", subs.String())
390
391 if epamount == 0 {
392 //
393 // Subscription route delete
394 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200395 r.RouteDelete(subs, trans, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200396
397 //
398 // Subscription release
399 //
400 r.mutex.Lock()
401 defer r.mutex.Unlock()
402
Juha Hyttinenaada6452020-04-07 08:47:58 +0300403 if _, ok := r.register[subId]; ok {
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200404 xapp.Logger.Debug("RELEASE %s", subs.String())
Juha Hyttinenaada6452020-04-07 08:47:58 +0300405 delete(r.register, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200406 xapp.Logger.Debug("Registry: substable=%v", r.register)
407 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300408 r.subIds = append(r.subIds, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200409 } else if subs.EpList.Size() > 0 {
410 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200411 // Subscription route update
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200412 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200413 r.RouteDeleteUpdate(subs, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200414 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200415 }()
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200416
417 return nil
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200418}
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200419
Anssi Mannila4abf1802021-01-28 13:06:46 +0200420func (r *Registry) RouteDelete(subs *Subscription, trans *TransactionXapp, c *Control) {
421 tmpList := xapp.RmrEndpointList{}
422 tmpList.AddEndpoint(trans.GetEndpoint())
423 subRouteAction := SubRouteInfo{tmpList, uint16(subs.ReqId.InstanceId)}
424 if err := r.rtmgrClient.SubscriptionRequestDelete(subRouteAction); err != nil {
425 c.UpdateCounter(cRouteDeleteFail)
426 }
427}
428
429func (r *Registry) RouteDeleteUpdate(subs *Subscription, c *Control) {
430 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
431 if err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction); err != nil {
432 c.UpdateCounter(cRouteDeleteUpdateFail)
433 }
434}
435
Anssi Mannilac92b4212020-12-07 14:59:34 +0200436func (r *Registry) UpdateSubscriptionToDb(subs *Subscription, c *Control) {
437 r.mutex.Lock()
438 defer r.mutex.Unlock()
439 subs.mutex.Lock()
440 defer subs.mutex.Unlock()
441
442 epamount := subs.EpList.Size()
443 if epamount == 0 {
444 if _, ok := r.register[subs.ReqId.InstanceId]; ok {
445 // Not merged subscription is being deleted
446 c.RemoveSubscriptionFromDb(subs)
447
448 }
449 } else if subs.EpList.Size() > 0 {
450 // Endpoint of merged subscription is being deleted
451 c.WriteSubscriptionToDb(subs)
Anssi Mannila4abf1802021-01-28 13:06:46 +0200452 c.UpdateCounter(cUnmergedSubscriptions)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200453 }
454}
455
Juha Hyttinenaada6452020-04-07 08:47:58 +0300456func (r *Registry) GetSubscription(subId uint32) *Subscription {
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200457 r.mutex.Lock()
458 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300459 if _, ok := r.register[subId]; ok {
460 return r.register[subId]
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200461 }
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200462 return nil
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000463}
464
Juha Hyttinenaada6452020-04-07 08:47:58 +0300465func (r *Registry) GetSubscriptionFirstMatch(subIds []uint32) (*Subscription, error) {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200466 r.mutex.Lock()
467 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300468 for _, subId := range subIds {
469 if _, ok := r.register[subId]; ok {
470 return r.register[subId], nil
Juha Hyttinen422d0182020-01-17 13:37:05 +0200471 }
472 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300473 return nil, fmt.Errorf("No valid subscription found with subIds %v", subIds)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200474}