blob: d7f801102036a1a79d9d3c19f09c9ce6c05023fc [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
40 SubReqOngoing bool
41 SubDelReqOngoing bool
42}
43
44func (r *RESTSubscription) AddInstanceId(instanceId uint32) {
45 r.InstanceIds = append(r.InstanceIds, instanceId)
46}
47
48func (r *RESTSubscription) SetProcessed() {
49 r.SubReqOngoing = false
50}
51
52func (r *RESTSubscription) DeleteInstanceId(instanceId uint32) {
53 r.InstanceIds = r.InstanceIds[1:]
54}
55
kalnagy45114752019-06-18 14:40:39 +020056type Registry struct {
archaggeafbf95f2021-04-14 08:54:05 +030057 mutex sync.Mutex
58 register map[uint32]*Subscription
59 subIds []uint32
60 rtmgrClient *RtmgrClient
61 restSubscriptions map[string]*RESTSubscription
kalnagy45114752019-06-18 14:40:39 +020062}
63
Anssi Mannila5c161a92020-01-15 15:40:57 +020064func (r *Registry) Initialize() {
Juha Hyttinen83ada002020-01-30 10:36:33 +020065 r.register = make(map[uint32]*Subscription)
archaggeafbf95f2021-04-14 08:54:05 +030066 r.restSubscriptions = make(map[string]*RESTSubscription)
67
Juha Hyttinen83ada002020-01-30 10:36:33 +020068 var i uint32
Anssi Mannilac92b4212020-12-07 14:59:34 +020069 for i = 1; i < 65535; i++ {
70 r.subIds = append(r.subIds, i)
Anssi Mannila5c161a92020-01-15 15:40:57 +020071 }
kalnagy45114752019-06-18 14:40:39 +020072}
73
archaggeafbf95f2021-04-14 08:54:05 +030074func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *string, maid *string) (*RESTSubscription, error) {
75 r.mutex.Lock()
76 defer r.mutex.Unlock()
77 newRestSubscription := RESTSubscription{}
78 newRestSubscription.xAppRmrEndPoint = *xAppRmrEndPoint
79 newRestSubscription.Meid = *maid
80 newRestSubscription.SubReqOngoing = true
81 newRestSubscription.SubDelReqOngoing = false
82 r.restSubscriptions[*restSubId] = &newRestSubscription
83 xapp.Logger.Info("Registry: Created REST subscription successfully. restSubId=%v, subscriptionCount=%v, e2apCubscriptionCount=%v", *restSubId, len(r.restSubscriptions), len(r.register))
84 return &newRestSubscription, nil
85}
86
87func (r *Registry) DeleteRESTSubscription(restSubId *string) {
88 r.mutex.Lock()
89 defer r.mutex.Unlock()
90 delete(r.restSubscriptions, *restSubId)
91 xapp.Logger.Info("Registry: Deleted REST subscription successfully. restSubId=%v, subscriptionCount=%v", *restSubId, len(r.restSubscriptions))
92}
93
94func (r *Registry) GetRESTSubscription(restSubId string) (*RESTSubscription, error) {
95 r.mutex.Lock()
96 defer r.mutex.Unlock()
97 if restSubscription, ok := r.restSubscriptions[restSubId]; ok {
98 // Subscription deletion is not allowed if prosessing subscription request in not ready
99 if restSubscription.SubDelReqOngoing == false && restSubscription.SubReqOngoing == false {
100 restSubscription.SubDelReqOngoing = true
101 r.restSubscriptions[restSubId] = restSubscription
102 return restSubscription, nil
103 } else {
104 return restSubscription, fmt.Errorf("Registry: REST delete request is still ongoing for the endpoint=%v, restSubId=%v, SubDelReqOngoing=%v, SubReqOngoing=%v", restSubscription, restSubId, restSubscription.SubDelReqOngoing, restSubscription.SubReqOngoing)
105 }
106 return restSubscription, nil
107 }
108 return nil, fmt.Errorf("Registry: No valid subscription found with restSubId=%v", restSubId)
109}
110
Juha Hyttinenc9eb08a2020-02-28 08:53:33 +0200111func (r *Registry) QueryHandler() (models.SubscriptionList, error) {
112 r.mutex.Lock()
113 defer r.mutex.Unlock()
114
115 resp := models.SubscriptionList{}
116 for _, subs := range r.register {
117 subs.mutex.Lock()
archaggea5c58bc2021-04-14 08:54:05 +0300118 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 +0200119 subs.mutex.Unlock()
120 }
121 return resp, nil
122}
123
Anssi Mannilac92b4212020-12-07 14:59:34 +0200124func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool) (*Subscription, error) {
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200125 if len(r.subIds) > 0 {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300126 subId := r.subIds[0]
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200127 r.subIds = r.subIds[1:]
Juha Hyttinenaada6452020-04-07 08:47:58 +0300128 if _, ok := r.register[subId]; ok == true {
129 r.subIds = append(r.subIds, subId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200130 return nil, fmt.Errorf("Registry: Failed to reserve subscription exists")
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200131 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200132 subs := &Subscription{
Anssi Mannilac92b4212020-12-07 14:59:34 +0200133 registry: r,
134 Meid: trans.Meid,
135 SubReqMsg: subReqMsg,
136 valid: true,
137 RetryFromXapp: false,
138 SubRespRcvd: false,
139 DeleteFromDb: false,
140 NoRespToXapp: false,
141 DoNotWaitSubResp: false,
Juha Hyttinen3944a222020-01-24 11:51:46 +0200142 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200143 subs.ReqId.Id = 123
Juha Hyttinenaada6452020-04-07 08:47:58 +0300144 subs.ReqId.InstanceId = subId
Anssi Mannilac92b4212020-12-07 14:59:34 +0200145 if resetTestFlag == true {
146 subs.DoNotWaitSubResp = true
147 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200148
149 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300150 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200151 return nil, fmt.Errorf("Registry: Endpoint existing already in subscription")
152 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200153 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200154 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200155 return nil, fmt.Errorf("Registry: Failed to reserve subscription no free ids")
156}
157
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200158func (r *Registry) findExistingSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest) (*Subscription, bool) {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200159
Juha Hyttinen3944a222020-01-24 11:51:46 +0200160 for _, subs := range r.register {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200161 if subs.IsMergeable(trans, subReqMsg) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200162
163 //
164 // check if there has been race conditions
165 //
166 subs.mutex.Lock()
167 //subs has been set to invalid
168 if subs.valid == false {
169 subs.mutex.Unlock()
170 continue
171 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200172 // If size is zero, entry is to be deleted
173 if subs.EpList.Size() == 0 {
174 subs.mutex.Unlock()
175 continue
176 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200177 // Try to add to endpointlist. Adding fails if endpoint is already in the list
Juha Hyttinen3944a222020-01-24 11:51:46 +0200178 if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false {
179 subs.mutex.Unlock()
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200180 xapp.Logger.Debug("Registry: Subs with requesting endpoint found. %s for %s", subs.String(), trans.String())
181 return subs, true
Juha Hyttinen3944a222020-01-24 11:51:46 +0200182 }
183 subs.mutex.Unlock()
184
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200185 xapp.Logger.Debug("Registry: Mergeable subs found. %s for %s", subs.String(), trans.String())
186 return subs, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200187 }
188 }
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200189 return nil, false
Juha Hyttinen3944a222020-01-24 11:51:46 +0200190}
191
Anssi Mannila4abf1802021-01-28 13:06:46 +0200192func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, c *Control) (*Subscription, error) {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200193 var err error
194 var newAlloc bool
195 r.mutex.Lock()
196 defer r.mutex.Unlock()
197
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200198 //
199 // Check validity of subscription action types
200 //
201 actionType, err := r.CheckActionTypes(subReqMsg)
202 if err != nil {
203 xapp.Logger.Debug("CREATE %s", err)
204 return nil, err
205 }
Juha Hyttinen3944a222020-01-24 11:51:46 +0200206
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200207 //
208 // Find possible existing Policy subscription
209 //
210 if actionType == e2ap.E2AP_ActionTypePolicy {
Juha Hyttinen47942b42020-02-27 10:41:43 +0200211 if subs, ok := r.register[trans.GetSubId()]; ok {
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200212 xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found.", subs.String())
Anssi Mannilacc7d9e02020-04-08 12:58:53 +0300213 // Update message data to subscription
214 subs.SubReqMsg = subReqMsg
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200215 subs.SetCachedResponse(nil, true)
216 return subs, nil
217 }
218 }
219
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200220 subs, endPointFound := r.findExistingSubs(trans, subReqMsg)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200221 if subs == nil {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200222 if subs, err = r.allocateSubs(trans, subReqMsg, resetTestFlag); err != nil {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200223 return nil, err
224 }
225 newAlloc = true
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200226 } else if endPointFound == true {
227 // Requesting endpoint is already present in existing subscription. This can happen if xApp is restarted.
Anssi Mannilac92b4212020-12-07 14:59:34 +0200228 subs.RetryFromXapp = true
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200229 xapp.Logger.Debug("CREATE: subscription already exists. %s", subs.String())
Anssi Mannila2f26fb22020-12-07 08:32:13 +0200230 return subs, nil
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200231 }
232
233 //
234 // Add to subscription
235 //
236 subs.mutex.Lock()
237 defer subs.mutex.Unlock()
238
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200239 epamount := subs.EpList.Size()
Anssi Mannila4abf1802021-01-28 13:06:46 +0200240 xapp.Logger.Info("AssignToSubscription subs.EpList.Size() = %v", subs.EpList.Size())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200241
242 r.mutex.Unlock()
243 //
244 // Subscription route updates
245 //
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200246 if epamount == 1 {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200247 err = r.RouteCreate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200248 } else {
Anssi Mannila4abf1802021-01-28 13:06:46 +0200249 err = r.RouteCreateUpdate(subs, c)
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200250 }
251 r.mutex.Lock()
252
253 if err != nil {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200254 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300255 r.subIds = append(r.subIds, subs.ReqId.InstanceId)
Juha Hyttinen3944a222020-01-24 11:51:46 +0200256 }
Anssi Mannila4abf1802021-01-28 13:06:46 +0200257 // Delete already added endpoint for the request
258 subs.EpList.DelEndpoint(trans.GetEndpoint())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200259 return nil, err
260 }
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200261
Juha Hyttinen3944a222020-01-24 11:51:46 +0200262 if newAlloc {
Juha Hyttinenaada6452020-04-07 08:47:58 +0300263 r.register[subs.ReqId.InstanceId] = subs
Juha Hyttinen3944a222020-01-24 11:51:46 +0200264 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200265 xapp.Logger.Debug("CREATE %s", subs.String())
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200266 xapp.Logger.Debug("Registry: substable=%v", r.register)
267 return subs, nil
268}
269
Anssi Mannila4abf1802021-01-28 13:06:46 +0200270func (r *Registry) RouteCreate(subs *Subscription, c *Control) error {
271 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
272 err := r.rtmgrClient.SubscriptionRequestCreate(subRouteAction)
273 if err != nil {
274 c.UpdateCounter(cRouteCreateFail)
275 }
276 return err
277}
278
279func (r *Registry) RouteCreateUpdate(subs *Subscription, c *Control) error {
280 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
281 err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
282 if err != nil {
283 c.UpdateCounter(cRouteCreateUpdateFail)
284 return err
285 }
286 c.UpdateCounter(cMergedSubscriptions)
287 return err
288}
289
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200290func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) {
291 var reportFound bool = false
292 var policyFound bool = false
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300293 var insertFound bool = false
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200294
295 for _, acts := range subReqMsg.ActionSetups {
296 if acts.ActionType == e2ap.E2AP_ActionTypeReport {
297 reportFound = true
298 }
299 if acts.ActionType == e2ap.E2AP_ActionTypePolicy {
300 policyFound = true
301 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300302 if acts.ActionType == e2ap.E2AP_ActionTypeInsert {
303 insertFound = true
304 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200305 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300306 if reportFound == true && policyFound == true || reportFound == true && insertFound == true || policyFound == true && insertFound == true {
307 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 +0200308 }
309 if reportFound == true {
310 return e2ap.E2AP_ActionTypeReport, nil
311 }
312 if policyFound == true {
313 return e2ap.E2AP_ActionTypePolicy, nil
314 }
Anssi Mannilaf0d95262020-08-17 13:00:20 +0300315 if insertFound == true {
316 return e2ap.E2AP_ActionTypeInsert, nil
317 }
Anssi Mannila9bcb0a42020-02-11 11:30:44 +0200318 return e2ap.E2AP_ActionTypeInvalid, fmt.Errorf("Invalid action type in RICactions-ToBeSetup-List")
319}
320
Juha Hyttinen83ada002020-01-30 10:36:33 +0200321// TODO: Works with concurrent calls, but check if can be improved
Anssi Mannilac92b4212020-12-07 14:59:34 +0200322func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *TransactionXapp, waitRouteClean time.Duration, c *Control) error {
Juha Hyttinen3944a222020-01-24 11:51:46 +0200323
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200324 r.mutex.Lock()
325 defer r.mutex.Unlock()
326 subs.mutex.Lock()
327 defer subs.mutex.Unlock()
328
329 delStatus := subs.EpList.DelEndpoint(trans.GetEndpoint())
330 epamount := subs.EpList.Size()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300331 subId := subs.ReqId.InstanceId
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200332
Juha Hyttinen83ada002020-01-30 10:36:33 +0200333 if delStatus == false {
334 return nil
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200335 }
Juha Hyttinen83ada002020-01-30 10:36:33 +0200336
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200337 go func() {
338 if waitRouteClean > 0 {
339 time.Sleep(waitRouteClean)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200340 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200341
342 subs.mutex.Lock()
343 defer subs.mutex.Unlock()
344 xapp.Logger.Info("CLEAN %s", subs.String())
345
346 if epamount == 0 {
347 //
348 // Subscription route delete
349 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200350 r.RouteDelete(subs, trans, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200351
352 //
353 // Subscription release
354 //
355 r.mutex.Lock()
356 defer r.mutex.Unlock()
357
Juha Hyttinenaada6452020-04-07 08:47:58 +0300358 if _, ok := r.register[subId]; ok {
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200359 xapp.Logger.Debug("RELEASE %s", subs.String())
Juha Hyttinenaada6452020-04-07 08:47:58 +0300360 delete(r.register, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200361 xapp.Logger.Debug("Registry: substable=%v", r.register)
362 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300363 r.subIds = append(r.subIds, subId)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200364 } else if subs.EpList.Size() > 0 {
365 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200366 // Subscription route update
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200367 //
Anssi Mannila4abf1802021-01-28 13:06:46 +0200368 r.RouteDeleteUpdate(subs, c)
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200369 }
Juha Hyttinenf44377d2020-02-12 10:18:40 +0200370 }()
Juha Hyttinen12d31af2020-01-22 12:59:01 +0200371
372 return nil
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200373}
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200374
Anssi Mannila4abf1802021-01-28 13:06:46 +0200375func (r *Registry) RouteDelete(subs *Subscription, trans *TransactionXapp, c *Control) {
376 tmpList := xapp.RmrEndpointList{}
377 tmpList.AddEndpoint(trans.GetEndpoint())
378 subRouteAction := SubRouteInfo{tmpList, uint16(subs.ReqId.InstanceId)}
379 if err := r.rtmgrClient.SubscriptionRequestDelete(subRouteAction); err != nil {
380 c.UpdateCounter(cRouteDeleteFail)
381 }
382}
383
384func (r *Registry) RouteDeleteUpdate(subs *Subscription, c *Control) {
385 subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)}
386 if err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction); err != nil {
387 c.UpdateCounter(cRouteDeleteUpdateFail)
388 }
389}
390
Anssi Mannilac92b4212020-12-07 14:59:34 +0200391func (r *Registry) UpdateSubscriptionToDb(subs *Subscription, c *Control) {
392 r.mutex.Lock()
393 defer r.mutex.Unlock()
394 subs.mutex.Lock()
395 defer subs.mutex.Unlock()
396
397 epamount := subs.EpList.Size()
398 if epamount == 0 {
399 if _, ok := r.register[subs.ReqId.InstanceId]; ok {
400 // Not merged subscription is being deleted
401 c.RemoveSubscriptionFromDb(subs)
402
403 }
404 } else if subs.EpList.Size() > 0 {
405 // Endpoint of merged subscription is being deleted
406 c.WriteSubscriptionToDb(subs)
Anssi Mannila4abf1802021-01-28 13:06:46 +0200407 c.UpdateCounter(cUnmergedSubscriptions)
Anssi Mannilac92b4212020-12-07 14:59:34 +0200408 }
409}
410
Juha Hyttinenaada6452020-04-07 08:47:58 +0300411func (r *Registry) GetSubscription(subId uint32) *Subscription {
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200412 r.mutex.Lock()
413 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300414 if _, ok := r.register[subId]; ok {
415 return r.register[subId]
Anssi Mannila2e99e2f2019-12-05 13:57:06 +0200416 }
Juha Hyttinen47b842b2020-01-08 13:01:52 +0200417 return nil
Peter Szilagyifbc56f92019-07-23 19:29:46 +0000418}
419
Juha Hyttinenaada6452020-04-07 08:47:58 +0300420func (r *Registry) GetSubscriptionFirstMatch(subIds []uint32) (*Subscription, error) {
Juha Hyttinen422d0182020-01-17 13:37:05 +0200421 r.mutex.Lock()
422 defer r.mutex.Unlock()
Juha Hyttinenaada6452020-04-07 08:47:58 +0300423 for _, subId := range subIds {
424 if _, ok := r.register[subId]; ok {
425 return r.register[subId], nil
Juha Hyttinen422d0182020-01-17 13:37:05 +0200426 }
427 }
Juha Hyttinenaada6452020-04-07 08:47:58 +0300428 return nil, fmt.Errorf("No valid subscription found with subIds %v", subIds)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200429}