This SDL version assumes that the DBAAS service provided by O-RAN community is
working as a storage backend.
+All functions except receiving of notifications are safe for concurrent usage by
+multiple goroutines.
+
Namespace
A shared data layer connection is instantiated to a namespace and data is
}
}
-func (db *DB) SubscribeChannelDB(cb ChannelNotificationCb, channelPrefix, eventSeparator string, channels ...string) {
+func (db *DB) SubscribeChannelDB(cb func(string, ...string), channelPrefix, eventSeparator string, channels ...string) {
if len(db.cbMap) == 0 {
for _, v := range channels {
db.cbMap[v] = cb
iDatabase
}
+//Database struct is a holder for the internal database instance. Applications
+//can use this exported data type to locally store a reference to database
+//instance returned from NewDabase() function.
+type Database struct {
+ instance iDatabase
+}
+
//NewDatabase creates a connection to database that will be used
-//as a backend for the key-value storage. The returned value shall
-//be given as a parameter when calling NewKeyValStorage
-func NewDatabase() *sdlgoredis.DB {
- return sdlgoredis.Create()
+//as a backend for the key-value storage. The returned value
+//can be reused between multiple SDL instances in which case each instance
+//is using the same connection.
+func NewDatabase() *Database {
+ return &Database{
+ instance: sdlgoredis.Create(),
+ }
}
//NewSdlInstance creates a new sdl instance using the given namespace.
//The database used as a backend is given as a parameter
-func NewSdlInstance(NameSpace string, db iDatabase) *SdlInstance {
+func NewSdlInstance(NameSpace string, db *Database) *SdlInstance {
return &SdlInstance{
nameSpace: NameSpace,
nsPrefix: "{" + NameSpace + "},",
eventSeparator: "___",
- iDatabase: db,
+ iDatabase: db.instance,
}
}
//callback as quickly as possible. E.g. reading in callback context should be avoided
//and using of Go signals is recommended. Also it should be noted that in case of several
//events received from different channels, callbacks are called in series one by one.
+//
+//This function is NOT SAFE FOR CONCURRENT USE by multiple goroutines.
func (s *SdlInstance) SubscribeChannel(cb func(string, ...string), channels ...string) error {
s.SubscribeChannelDB(cb, s.nsPrefix, s.eventSeparator, s.setNamespaceToChannels(channels...)...)
return nil
}
type iDatabase interface {
- SubscribeChannelDB(cb sdlgoredis.ChannelNotificationCb, channelPrefix, eventSeparator string, channels ...string)
+ SubscribeChannelDB(cb func(string, ...string), channelPrefix, eventSeparator string, channels ...string)
UnsubscribeChannelDB(channels ...string)
MSet(pairs ...interface{}) error
MSetMPub(channelsAndEvents []string, pairs ...interface{}) error
--- /dev/null
+/*
+ Copyright (c) 2019 AT&T Intellectual Property.
+ Copyright (c) 2018-2019 Nokia.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package sdlgo
+
+//NewSdlInstanceForTest is used in unit tests only in order to replace the
+//underlying redis implementation with mock
+func NewSdlInstanceForTest(NameSpace string, instance iDatabase) *SdlInstance {
+ return &SdlInstance{
+ nameSpace: NameSpace,
+ nsPrefix: "{" + NameSpace + "},",
+ eventSeparator: "___",
+ iDatabase: instance,
+ }
+}
"time"
"gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
- "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
mock.Mock
}
-func (m *mockDB) SubscribeChannelDB(cb sdlgoredis.ChannelNotificationCb, channelPrefix, eventSeparator string, channels ...string) {
+func (m *mockDB) SubscribeChannelDB(cb func(string, ...string), channelPrefix, eventSeparator string, channels ...string) {
m.Called(cb, channelPrefix, eventSeparator, channels)
}
func setup() (*mockDB, *sdlgo.SdlInstance) {
m := new(mockDB)
- i := sdlgo.NewSdlInstance("namespace", m)
+ i := sdlgo.NewSdlInstanceForTest("namespace", m)
return m, i
}
expectedCB := func(channel string, events ...string) {}
expectedChannels := []string{"{namespace},channel1", "{namespace},channel2"}
- m.On("SubscribeChannelDB", mock.AnythingOfType("sdlgoredis.ChannelNotificationCb"), "{namespace},", "___", expectedChannels).Return()
+ m.On("SubscribeChannelDB", mock.AnythingOfType("func(string, ...string)"), "{namespace},", "___", expectedChannels).Return()
i.SubscribeChannel(expectedCB, "channel1", "channel2")
m.AssertExpectations(t)
}