RICPLT-2965 Unittest to support multiple xappconns
[ric-plt/submgr.git] / pkg / control / registry.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
20 package control
21
22 import (
23         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
24         "sync"
25 )
26
27 type Subscription struct {
28         Seq       uint16
29         Confirmed bool
30 }
31
32 type Registry struct {
33         register map[uint16]*Subscription
34         counter  uint16
35         mutex    sync.Mutex
36 }
37
38 // This method should run as a constructor
39 func (r *Registry) Initialize(seedsn uint16) {
40         r.register = make(map[uint16]*Subscription)
41         r.counter = seedsn
42 }
43
44 // Reserves and returns the next free sequence number
45 func (r *Registry) ReserveSequenceNumber() (uint16, bool) {
46         // Check is current SequenceNumber valid
47         r.mutex.Lock()
48         defer r.mutex.Unlock()
49         sequenceNumber := r.counter
50         if _, ok := r.register[sequenceNumber]; ok {
51                 xapp.Logger.Error("Invalid SeqenceNumber sequenceNumber: %v", sequenceNumber)
52                 return sequenceNumber, false
53         }
54         r.register[sequenceNumber] = &Subscription{sequenceNumber, false}
55
56         // Allocate next SequenceNumber value
57         if r.counter == 65535 {
58                 r.counter = 0
59         } else {
60                 r.counter++
61         }
62         return sequenceNumber, true
63 }
64
65 // This function checks the validity of the given subscription id
66 func (r *Registry) IsValidSequenceNumber(sn uint16) bool {
67         r.mutex.Lock()
68         defer r.mutex.Unlock()
69         xapp.Logger.Debug("Registry map: %v", r.register)
70         if _, ok := r.register[sn]; ok {
71                 return true
72         }
73         return false
74 }
75
76 // This function sets the give id as confirmed in the register
77 func (r *Registry) setSubscriptionToConfirmed(sn uint16) {
78         r.mutex.Lock()
79         defer r.mutex.Unlock()
80         r.register[sn].Confirmed = true
81 }
82
83 //This function sets the given id as unused in the register
84 func (r *Registry) deleteSubscription(sn uint16) {
85         r.mutex.Lock()
86         defer r.mutex.Unlock()
87         r.register[sn].Confirmed = false
88 }
89
90 //This function releases the given id as unused in the register
91 func (r *Registry) releaseSequenceNumber(sn uint16) bool {
92         r.mutex.Lock()
93         defer r.mutex.Unlock()
94         if _, ok := r.register[sn]; ok {
95                 delete(r.register, sn)
96                 return true
97         } else {
98                 return false
99         }
100 }