blob: 416b4156116633bfcf6938220ecd3b2ad81e4595 [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
43}
44
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000045func (r *RESTSubscription) AddE2InstanceId(instanceId uint32) {
archaggeafbf95f2021-04-14 08:54:05 +030046 r.InstanceIds = append(r.InstanceIds, instanceId)
47}
48
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000049func (r *RESTSubscription) DeleteE2InstanceId(instanceId uint32) {
50 r.InstanceIds = r.InstanceIds[1:]
51}
52
53func (r *RESTSubscription) AddXappIdToE2Id(xAppEventInstanceID int64, e2EventInstanceID int64) {
54 r.xAppIdToE2Id[xAppEventInstanceID] = e2EventInstanceID
55}
56
57func (r *RESTSubscription) GetE2IdFromXappIdToE2Id(xAppEventInstanceID int64) int64 {
58 return r.xAppIdToE2Id[xAppEventInstanceID]
59}
60
61func (r *RESTSubscription) DeleteXappIdToE2Id(xAppEventInstanceID int64) {
62 delete(r.xAppIdToE2Id, xAppEventInstanceID)
63}
64
archaggeafbf95f2021-04-14 08:54:05 +030065func (r *RESTSubscription) SetProcessed() {
66 r.SubReqOngoing = false
67}
68
kalnagy45114752019-06-18 14:40:39 +020069type Registry struct {
archaggeafbf95f2021-04-14 08:54:05 +030070 mutex sync.Mutex
71 register map[uint32]*Subscription
72 subIds []uint32
73 rtmgrClient *RtmgrClient
74 restSubscriptions map[string]*RESTSubscription
kalnagy45114752019-06-18 14:40:39 +020075}
76
Anssi Mannila5c161a92020-01-15 15:40:57 +020077func (r *Registry) Initialize() {
Juha Hyttinen83ada002020-01-30 10:36:33 +020078 r.register = make(map[uint32]*Subscription)
archaggeafbf95f2021-04-14 08:54:05 +030079 r.restSubscriptions = make(map[string]*RESTSubscription)
80
Juha Hyttinen83ada002020-01-30 10:36:33 +020081 var i uint32
Anssi Mannilac92b4212020-12-07 14:59:34 +020082 for i = 1; i < 65535; i++ {
83 r.subIds = append(r.subIds, i)
Anssi Mannila5c161a92020-01-15 15:40:57 +020084 }
kalnagy45114752019-06-18 14:40:39 +020085}
86
archaggeafbf95f2021-04-14 08:54:05 +030087func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *string, maid *string) (*RESTSubscription, error) {
88 r.mutex.Lock()
89 defer r.mutex.Unlock()
90 newRestSubscription := RESTSubscription{}
91 newRestSubscription.xAppRmrEndPoint = *xAppRmrEndPoint
92 newRestSubscription.Meid = *maid
93 newRestSubscription.SubReqOngoing = true
94 newRestSubscription.SubDelReqOngoing = false
95 r.restSubscriptions[*restSubId] = &newRestSubscription
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +000096 newRestSubscription.xAppIdToE2Id = make(map[int64]int64)
Anssi Mannila316d8a12021-06-02 11:08:54 +030097 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 +030098 return &newRestSubscription, nil
99}
100
101func (r *Registry) DeleteRESTSubscription(restSubId *string) {
102 r.mutex.Lock()
103 defer r.mutex.Unlock()
104 delete(r.restSubscriptions, *restSubId)
105 xapp.Logger.Info("Registry: Deleted REST subscription successfully. restSubId=%v, subscriptionCount=%v", *restSubId, len(r.restSubscriptions))
106}
107
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000108func (r *Registry) GetRESTSubscription(restSubId string, IsDelReqOngoing bool) (*RESTSubscription, error) {
archaggeafbf95f2021-04-14 08:54:05 +0300109 r.mutex.Lock()
110 defer r.mutex.Unlock()
111 if restSubscription, ok := r.restSubscriptions[restSubId]; ok {
112 // Subscription deletion is not allowed if prosessing subscription request in not ready
113 if restSubscription.SubDelReqOngoing == false && restSubscription.SubReqOngoing == false {
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000114 if IsDelReqOngoing == true {
115 restSubscription.SubDelReqOngoing = true
116 }
archaggeafbf95f2021-04-14 08:54:05 +0300117 r.restSubscriptions[restSubId] = restSubscription
118 return restSubscription, nil
119 } else {
Markku Virtanenda34eec2021-05-20 08:22:04 +0000120 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 +0300121 }
122 return restSubscription, nil
123 }
124 return nil, fmt.Errorf("Registry: No valid subscription found with restSubId=%v", restSubId)
125}
126
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200127func (r *Registry) QueryHandler() (models.SubscriptionList, error) {
128 r.mutex.Lock()
129 defer r.mutex.Unlock()
130
131 resp := models.SubscriptionList{}
132 for _, subs := range r.register {
133 subs.mutex.Lock()
archaggea5c58bc2021-04-14 08:54:05 +0300134 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 +0200135 subs.mutex.Unlock()
136 }
137 return resp, nil
138}
139
Anssi Mannilac92b4212020-12-07 14:59:34 +0200140func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool) (*Subscription, error) {
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200141 if len(r.subIds) > 0 {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300142 subId := r.subIds[0]
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200143 r.subIds = r.subIds[1:]
Juha Hyttinenaada6452020-04-07 08:47:58 +0300144 if _, ok := r.register[subId]; ok == true {
145 r.subIds = append(r.subIds, subId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200146 return nil, fmt.Errorf("Registry: Failed to reserve subscription exists")
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200147 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200148 subs := &Subscription{
Anssi Mannilac92b4212020-12-07 14:59:34 +0200149 registry: r,
150 Meid: trans.Meid,
151 SubReqMsg: subReqMsg,
152 valid: true,
153 RetryFromXapp: false,
154 SubRespRcvd: false,
155 DeleteFromDb: false,
156 NoRespToXapp: false,
157 DoNotWaitSubResp: false,
Juha Hyttinen3944a222020-01-24 11:51:46 +0200158 }
Konstantinos Archangelofe93b00f2021-06-03 10:00:19 +0000159 subs.ReqId.Id = subReqMsg.RequestId.Id
Juha Hyttinenaada6452020-04-07 08:47:58 +0300160 subs.ReqId.InstanceId = subId
Anssi Mannilac92b4212020-12-07 14:59:34 +0200161 if resetTestFlag == true {
162 subs.DoNotWaitSubResp = true
163 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200164
165 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300166 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200167 return nil, fmt.Errorf("Registry: Endpoint existing already in subscription")
168 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200169 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200170 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200171 return nil, fmt.Errorf("Registry: Failed to reserve subscription no free ids")
172}
173
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200174func (r *Registry) findExistingSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest) (*Subscription, bool) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200175
Juha Hyttinen3944a222020-01-24 11:51:46 +0200176 for _, subs := range r.register {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200177 if subs.IsMergeable(trans, subReqMsg) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200178
179 //
180 // check if there has been race conditions
181 //
182 subs.mutex.Lock()
183 //subs has been set to invalid
184 if subs.valid == false {
185 subs.mutex.Unlock()
186 continue
187 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200188 // If size is zero, entry is to be deleted
189 if subs.EpList.Size() == 0 {
190 subs.mutex.Unlock()
191 continue
192 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200193 // Try to add to endpointlist. Adding fails if endpoint is already in the list
Juha Hyttinen3944a222020-01-24 11:51:46 +0200194 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
195 subs.mutex.Unlock()
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200196 xapp.Logger.Debug("Registry: Subs with requesting endpoint found. %s for %s", subs.String(), trans.String())
197 return subs, true
Juha Hyttinen3944a222020-01-24 11:51:46 +0200198 }
199 subs.mutex.Unlock()
200
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200201 xapp.Logger.Debug("Registry: Mergeable subs found. %s for %s", subs.String(), trans.String())
202 return subs, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200203 }
204 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200205 return nil, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200206}
207
Anssi Mannila4abf1802021-01-28 13:06:46 +0200208func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, c *Control) (*Subscription, error) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200209 var err error
210 var newAlloc bool
211 r.mutex.Lock()
212 defer r.mutex.Unlock()
213
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200214 //
215 // Check validity of subscription action types
216 //
217 actionType, err := r.CheckActionTypes(subReqMsg)
218 if err != nil {
219 xapp.Logger.Debug("CREATE %s", err)
220 return nil, err
221 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200222
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200223 //
224 // Find possible existing Policy subscription
225 //
226 if actionType == e2ap.E2AP_ActionTypePolicy {
Juha Hyttinen47942b42020-02-27 10:41:43 +0200227 if subs, ok := r.register[trans.GetSubId()]; ok {
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200228 xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found.", subs.String())
Anssi Mannilacc7d9e02020-04-08 12:58:53 +0300229 // Update message data to subscription
230 subs.SubReqMsg = subReqMsg
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200231 subs.SetCachedResponse(nil, true)
232 return subs, nil
233 }
234 }
235
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200236 subs, endPointFound := r.findExistingSubs(trans, subReqMsg)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200237 if subs == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200238 if subs, err = r.allocateSubs(trans, subReqMsg, resetTestFlag); err != nil {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200239 return nil, err
240 }
241 newAlloc = true
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200242 } else if endPointFound == true {
243 // Requesting endpoint is already present in existing subscription. This can happen if xApp is restarted.
Anssi Mannilac92b4212020-12-07 14:59:34 +0200244 subs.RetryFromXapp = true
Anssi Mannila316d8a12021-06-02 11:08:54 +0300245 xapp.Logger.Debug("CREATE subReqMsg.InstanceId=%v. Same subscription %s already exists.", subReqMsg.InstanceId, subs.String())
246 c.UpdateCounter(cDuplicateE2SubReq)
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200247 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200248 }
249
250 //
251 // Add to subscription
252 //
253 subs.mutex.Lock()
254 defer subs.mutex.Unlock()
255
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200256 epamount := subs.EpList.Size()
Anssi Mannila316d8a12021-06-02 11:08:54 +0300257 xapp.Logger.Info("AssignToSubscription subs.EpList.Size()=%v", subs.EpList.Size())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200258
259 r.mutex.Unlock()
260 //
261 // Subscription route updates
262 //
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200263 if epamount == 1 {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200264 err = r.RouteCreate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200265 } else {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200266 err = r.RouteCreateUpdate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200267 }
268 r.mutex.Lock()
269
270 if err != nil {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200271 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300272 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200273 }
Anssi Mannila4abf1802021-01-28 13:06:46 +0200274 // Delete already added endpoint for the request
275 subs.EpList.DelEndpoint(trans.GetEndpoint())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200276 return nil, err
277 }
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200278
Juha Hyttinen3944a222020-01-24 11:51:46 +0200279 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300280 r.register[subs.ReqId.InstanceId] = subs
Juha Hyttinen3944a222020-01-24 11:51:46 +0200281 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200282 xapp.Logger.Debug("CREATE %s", subs.String())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200283 xapp.Logger.Debug("Registry: substable=%v", r.register)
284 return subs, nil
285}
286
Anssi Mannila4abf1802021-01-28 13:06:46 +0200287func (r *Registry) RouteCreate(subs *Subscription, c *Control) error {
288 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
289 err := r.rtmgrClient.SubscriptionRequestCreate(subRouteAction)
290 if err != nil {
291 c.UpdateCounter(cRouteCreateFail)
292 }
293 return err
294}
295
296func (r *Registry) RouteCreateUpdate(subs *Subscription, c *Control) error {
297 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
298 err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
299 if err != nil {
300 c.UpdateCounter(cRouteCreateUpdateFail)
301 return err
302 }
303 c.UpdateCounter(cMergedSubscriptions)
304 return err
305}
306
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200307func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) {
308 var reportFound bool = false
309 var policyFound bool = false
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300310 var insertFound bool = false
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200311
312 for _, acts := range subReqMsg.ActionSetups {
313 if acts.ActionType == e2ap.E2AP_ActionTypeReport {
314 reportFound = true
315 }
316 if acts.ActionType == e2ap.E2AP_ActionTypePolicy {
317 policyFound = true
318 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300319 if acts.ActionType == e2ap.E2AP_ActionTypeInsert {
320 insertFound = true
321 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200322 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300323 if reportFound == true && policyFound == true || reportFound == true && insertFound == true || policyFound == true && insertFound == true {
324 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 +0200325 }
326 if reportFound == true {
327 return e2ap.E2AP_ActionTypeReport, nil
328 }
329 if policyFound == true {
330 return e2ap.E2AP_ActionTypePolicy, nil
331 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300332 if insertFound == true {
333 return e2ap.E2AP_ActionTypeInsert, nil
334 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200335 return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Invalid action type in RICactions-ToBeSetup-List")
336}
337
Juha Hyttinen83ada002020-01-30 10:36:33 +0200338// TODO: Works with concurrent calls, but check if can be improved
Anssi Mannilac92b4212020-12-07 14:59:34 +0200339func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *TransactionXapp, waitRouteClean time.Duration, c *Control) error {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200340
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200341 r.mutex.Lock()
342 defer r.mutex.Unlock()
343 subs.mutex.Lock()
344 defer subs.mutex.Unlock()
345
346 delStatus := subs.EpList.DelEndpoint(trans.GetEndpoint())
347 epamount := subs.EpList.Size()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300348 subId := subs.ReqId.InstanceId
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200349
Juha Hyttinen83ada002020-01-30 10:36:33 +0200350 if delStatus == false {
351 return nil
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200352 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200353
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200354 go func() {
355 if waitRouteClean > 0 {
Markku Virtanenfe2cdab2021-05-21 10:59:29 +0000356 xapp.Logger.Debug("Pending %v in order to wait route cleanup", waitRouteClean)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200357 time.Sleep(waitRouteClean)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200358 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200359
360 subs.mutex.Lock()
361 defer subs.mutex.Unlock()
362 xapp.Logger.Info("CLEAN %s", subs.String())
363
364 if epamount == 0 {
365 //
366 // Subscription route delete
367 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200368 r.RouteDelete(subs, trans, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200369
370 //
371 // Subscription release
372 //
373 r.mutex.Lock()
374 defer r.mutex.Unlock()
375
Juha Hyttinenaada6452020-04-07 08:47:58 +0300376 if _, ok := r.register[subId]; ok {
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200377 xapp.Logger.Debug("RELEASE %s", subs.String())
Juha Hyttinenaada6452020-04-07 08:47:58 +0300378 delete(r.register, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200379 xapp.Logger.Debug("Registry: substable=%v", r.register)
380 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300381 r.subIds = append(r.subIds, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200382 } else if subs.EpList.Size() > 0 {
383 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200384 // Subscription route update
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200385 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200386 r.RouteDeleteUpdate(subs, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200387 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200388 }()
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200389
390 return nil
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200391}
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200392
Anssi Mannila4abf1802021-01-28 13:06:46 +0200393func (r *Registry) RouteDelete(subs *Subscription, trans *TransactionXapp, c *Control) {
394 tmpList := xapp.RmrEndpointList{}
395 tmpList.AddEndpoint(trans.GetEndpoint())
396 subRouteAction := SubRouteInfo{tmpList, uint16(subs.ReqId.InstanceId)}
397 if err := r.rtmgrClient.SubscriptionRequestDelete(subRouteAction); err != nil {
398 c.UpdateCounter(cRouteDeleteFail)
399 }
400}
401
402func (r *Registry) RouteDeleteUpdate(subs *Subscription, c *Control) {
403 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
404 if err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction); err != nil {
405 c.UpdateCounter(cRouteDeleteUpdateFail)
406 }
407}
408
Anssi Mannilac92b4212020-12-07 14:59:34 +0200409func (r *Registry) UpdateSubscriptionToDb(subs *Subscription, c *Control) {
410 r.mutex.Lock()
411 defer r.mutex.Unlock()
412 subs.mutex.Lock()
413 defer subs.mutex.Unlock()
414
415 epamount := subs.EpList.Size()
416 if epamount == 0 {
417 if _, ok := r.register[subs.ReqId.InstanceId]; ok {
418 // Not merged subscription is being deleted
419 c.RemoveSubscriptionFromDb(subs)
420
421 }
422 } else if subs.EpList.Size() > 0 {
423 // Endpoint of merged subscription is being deleted
424 c.WriteSubscriptionToDb(subs)
Anssi Mannila4abf1802021-01-28 13:06:46 +0200425 c.UpdateCounter(cUnmergedSubscriptions)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200426 }
427}
428
Juha Hyttinenaada6452020-04-07 08:47:58 +0300429func (r *Registry) GetSubscription(subId uint32) *Subscription {
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200430 r.mutex.Lock()
431 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300432 if _, ok := r.register[subId]; ok {
433 return r.register[subId]
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200434 }
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200435 return nil
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000436}
437
Juha Hyttinenaada6452020-04-07 08:47:58 +0300438func (r *Registry) GetSubscriptionFirstMatch(subIds []uint32) (*Subscription, error) {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200439 r.mutex.Lock()
440 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300441 for _, subId := range subIds {
442 if _, ok := r.register[subId]; ok {
443 return r.register[subId], nil
Juha Hyttinen422d0182020-01-17 13:37:05 +0200444 }
445 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300446 return nil, fmt.Errorf("No valid subscription found with subIds %v", subIds)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200447}