e422cfde69ebbcb034c4c1ce6ef9799a893720f2
[ric-plt/xapp-frame.git] / pkg / xapp / db.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 xapp
21
22 import (
23         rnibentities "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
24         rnibreader "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
25         sdl "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
26         rnibwriter "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/rnib"
27         "sync"
28         "time"
29 )
30
31 // To be removed later
32 type SDLStatistics struct{}
33
34 var SDLCounterOpts = []CounterOpts{
35         {Name: "Stored", Help: "The total number of stored SDL transactions"},
36         {Name: "StoreError", Help: "The total number of SDL store errors"},
37 }
38
39 type SDLClient struct {
40         db    *sdl.SdlInstance
41         stat  map[string]Counter
42         mux   sync.Mutex
43         ready bool
44 }
45
46 // Alias
47 type RNIBNodeType = rnibentities.Node_Type
48 type RNIBGlobalNbId = rnibentities.GlobalNbId
49 type RNIBNodebInfo = rnibentities.NodebInfo
50 type RNIBIRNibError = error
51 type RNIBCells = rnibentities.Cells
52 type RNIBNbIdentity = rnibentities.NbIdentity
53 type RNIBCellType = rnibentities.Cell_Type
54 type RNIBCell = rnibentities.Cell
55 type RNIBEnb = rnibentities.Enb
56 type RNIBGnb = rnibentities.Gnb
57
58 const RNIBNodeENB = rnibentities.Node_ENB
59 const RNIBNodeGNB = rnibentities.Node_GNB
60
61 type RNIBServedCellInfo = rnibentities.ServedCellInfo
62 type RNIBNodebInfoEnb = rnibentities.NodebInfo_Enb
63 type RNIBNodebInfoGnb = rnibentities.NodebInfo_Gnb
64 type RNIBServedNRCell = rnibentities.ServedNRCell
65 type RNIBServedNRCellInformation = rnibentities.ServedNRCellInformation
66 type RNIBNrNeighbourInformation = rnibentities.NrNeighbourInformation
67
68 type RNIBClient struct {
69         db     *sdl.SdlInstance
70         reader rnibreader.RNibReader
71         writer rnibwriter.RNibWriter
72 }
73
74 // NewSDLClient returns a new SDLClient.
75 func NewSDLClient(ns string) *SDLClient {
76         if ns == "" {
77                 ns = "sdl"
78         }
79         return &SDLClient{
80                 db:    sdl.NewSdlInstance(ns, sdl.NewDatabase()),
81                 stat:  Metric.RegisterCounterGroup(SDLCounterOpts, "SDL"),
82                 ready: false,
83         }
84 }
85
86 func (s *SDLClient) TestConnection() {
87         // Test DB connection, and wait until ready!
88         for {
89                 if _, err := s.db.GetAll(); err == nil {
90                         break
91                 }
92                 Logger.Warn("Database connection not ready, waiting ...")
93                 time.Sleep(time.Duration(5 * time.Second))
94         }
95         s.ready = true
96         Logger.Info("Connection to database established!")
97 }
98
99 func (s *SDLClient) IsReady() bool {
100         return s.ready
101 }
102
103 func (s *SDLClient) doSet(pairs ...interface{}) (err error) {
104         err = s.db.Set(pairs)
105         if err != nil {
106                 s.UpdateStatCounter("StoreError")
107         } else {
108                 s.UpdateStatCounter("Stored")
109         }
110         return
111 }
112
113 func (s *SDLClient) Store(key string, value interface{}) (err error) {
114         return s.doSet(key, value)
115 }
116
117 func (s *SDLClient) MStore(pairs ...interface{}) (err error) {
118         return s.doSet(pairs)
119 }
120
121 func (s *SDLClient) Read(key string) (value map[string]interface{}, err error) {
122         return s.db.Get([]string{key})
123 }
124
125 func (s *SDLClient) MRead(key []string) (value map[string]interface{}, err error) {
126         return s.db.Get(key)
127 }
128
129 func (s *SDLClient) ReadAllKeys(key string) (value []string, err error) {
130         return s.db.GetAll()
131 }
132
133 func (s *SDLClient) Subscribe(cb func(string, ...string), channel string) error {
134         return s.db.SubscribeChannel(cb, channel)
135 }
136
137 func (s *SDLClient) MSubscribe(cb func(string, ...string), channels ...string) error {
138         return s.db.SubscribeChannel(cb, channels...)
139 }
140
141 func (s *SDLClient) StoreAndPublish(channel string, event string, pairs ...interface{}) error {
142         return s.db.SetAndPublish([]string{channel, event}, pairs...)
143 }
144
145 func (s *SDLClient) MStoreAndPublish(channelsAndEvents []string, pairs ...interface{}) error {
146         return s.db.SetAndPublish(channelsAndEvents, pairs...)
147 }
148
149 func (s *SDLClient) Delete(keys []string) (err error) {
150         return s.db.Remove(keys)
151 }
152
153 func (s *SDLClient) Clear() {
154         s.db.RemoveAll()
155 }
156
157 func (s *SDLClient) RegisterMetrics() {
158         s.stat = Metric.RegisterCounterGroup(SDLCounterOpts, "SDL")
159 }
160
161 func (s *SDLClient) UpdateStatCounter(name string) {
162         s.mux.Lock()
163         s.stat[name].Inc()
164         s.mux.Unlock()
165 }
166
167 func (c *SDLClient) GetStat() (t SDLStatistics) {
168         return
169 }
170
171 func NewRNIBClient() *RNIBClient {
172         s := sdl.NewSdlInstance("e2Manager", sdl.NewDatabase())
173         return &RNIBClient{
174                 db:     s,
175                 reader: nil,
176                 writer: nil,
177         }
178 }
179
180 func (r *RNIBClient) Subscribe(cb func(string, ...string), channel string) error {
181         return r.db.SubscribeChannel(cb, channel)
182 }
183
184 func (r *RNIBClient) StoreAndPublish(channel string, event string, pairs ...interface{}) error {
185         return r.db.SetAndPublish([]string{channel, event}, pairs...)
186 }
187
188 func (r *RNIBClient) GetNodeb(invName string) (*RNIBNodebInfo, RNIBIRNibError) {
189         return rnibreader.GetRNibReader(r.db).GetNodeb(invName)
190 }
191
192 func (r *RNIBClient) GetNodebByGlobalNbId(t RNIBNodeType, gid *RNIBGlobalNbId) (*RNIBNodebInfo, RNIBIRNibError) {
193         return rnibreader.GetRNibReader(r.db).GetNodebByGlobalNbId(t, gid)
194 }
195
196 func (r *RNIBClient) GetCellList(invName string) (*RNIBCells, RNIBIRNibError) {
197         return rnibreader.GetRNibReader(r.db).GetCellList(invName)
198 }
199
200 func (r *RNIBClient) GetListGnbIds() ([]*RNIBNbIdentity, RNIBIRNibError) {
201         return rnibreader.GetRNibReader(r.db).GetListGnbIds()
202 }
203
204 func (r *RNIBClient) GetListEnbIds() ([]*RNIBNbIdentity, RNIBIRNibError) {
205         return rnibreader.GetRNibReader(r.db).GetListEnbIds()
206 }
207
208 func (r *RNIBClient) GetCountGnbList() (int, RNIBIRNibError) {
209         return rnibreader.GetRNibReader(r.db).GetCountGnbList()
210 }
211
212 func (r *RNIBClient) GetCell(invName string, pci uint32) (*RNIBCell, RNIBIRNibError) {
213         return rnibreader.GetRNibReader(r.db).GetCell(invName, pci)
214 }
215
216 func (r *RNIBClient) GetCellById(cellType RNIBCellType, cellId string) (*RNIBCell, RNIBIRNibError) {
217         return rnibreader.GetRNibReader(r.db).GetCellById(cellType, cellId)
218 }
219
220 func (r *RNIBClient) SaveNodeb(nbIdentity *RNIBNbIdentity, entity *RNIBNodebInfo) RNIBIRNibError {
221         return rnibwriter.GetRNibWriter(r.db).SaveNodeb(nbIdentity, entity)
222 }