* Following Redis extension commands have been installed to runtime environment:
- MSETPUB
- SETIE
- - SETIEPUB
- - SETNXPUB
- - DELPUB
+ - SETIEMPUB
+ - SETNXMPUB
+ - DELMPUB
- DELIE
- - DELIEPUB
+ - DELIEMPUB
Redis v4.0 or greater is required. Older versions do not support extension modules.
Implementation of above commands is produced by RIC DBaaS:
https://gerrit.o-ran-sc.org/r/admin/repos/ric-plt/dbaas
running Redis.
* Following environment variables are needed to set to the pod/container where the application
utilizing SDL is going to be run.
- DBAAS_SERVICE_HOST = [redis server address]
- DBAAS_SERVICE_PORT= [redis server port]
- DBAAS_MASTER_NAME = [master Redis sentinel name]. Needed to set only if sentinel is in use.
- DBAAS_SERVICE_SENTINEL_PORT = [Redis sentinel port number]. Needed to set only if sentinel
- is in use.
+ DBAAS_SERVICE_HOST = [DB service address]
+ DBAAS_SERVICE_PORT= [DB service port]
+ DBAAS_MASTER_NAME = [DB name]. Needed to set only if Redis sentinel is used to provide high
+ availability for Redis DB solution.
+ DBAAS_SERVICE_SENTINEL_PORT = [Redis sentinel port number]. Needed to set only if Redis
+ sentinel is in use.
+ DBASS_CLUSTER_ADDR_LIST = [list of DB service addresses]. Is set only if more than one
+ Redis sentinel groups are in use.
+ In official RIC deployments four first environment variables are defined in Helm configMaps
+ of the DBaaS and these configurations can be loaded automatically as environment variables
+ into application pods via `envFrom dbaas-appconfig` statement in an application Helm Charts.
+ The last environment variable is not for time being in use in official RIC deployments, only
+ in Nokia SEP deployments.
"""
import threading
from ricsdl.syncstorage import SyncStorage
from ricsdl.exceptions import RejectedByBackend, NotConnected, BackendError
+from typing import (Union, List)
# There are two available methods for applications to handle notifications:
# - EVENT_LISTENER (true):
# - User calls sdl.start_event_listener() which will create an SDL managed
# event loop for handling messages.
# - EVENT_LISTENER (false):
-# - User need to call sdl.handle_messages() which will return the message
+# - User need to call sdl.handle_events() which will return the message
#
# Note: In both cases, the given callback function will be executed.
EVENT_LISTENER = True
stop_thread = False
-def cb(channel: str, message: str):
- """An example of function that will be called when an event is received.
+def cb(channel: str, message: Union[str, List[str]]):
+ """An example of function that will be called when a single event or list of
+ events are received.
This function sets last_cb_channel and last_cb_message as channel and
message respectively. This also unlocks the global lock variable.
pass
time.sleep(0.001)
+# Subscribe to MY_CHANNEL. We expect that anytime we receive a message in the
+# channel, cb function will be called.
+_try_func_return(lambda: mysdl.subscribe_channel(MY_NS, cb, MY_CHANNEL))
# As mentioned above, there are two available methods for applications to
# handle notifications
thread = threading.Thread(target=listen_thread)
thread.start()
-# Subscribe to MY_CHANNEL. We expect that anytime we receive a message in the
-# channel, cb function will be called.
-_try_func_return(lambda: mysdl.subscribe_channel(MY_NS, cb, MY_CHANNEL))
-
# Sets a value 'my_value' for a key 'my_key' under given namespace. Note that value
# type must be bytes and multiple key values can be set in one set function call.
_try_func_callback_return(
lambda: mysdl.set_and_publish(MY_NS, {MY_CHANNEL: "SET PUBLISH"}, {'my_key': b'my_value'}))
assert last_cb_channel == MY_CHANNEL and last_cb_message == "SET PUBLISH"
+# Sets a value 'my_value' for a key 'my_key' under given namespace. Note that value
+# type must be bytes and multiple key values can be set in one set function call.
+# Function publishes two events into one channel.
+_try_func_callback_return(
+ lambda: mysdl.set_and_publish(MY_NS, {MY_CHANNEL: ["SET PUBLISH1", "SET PUBLISH2"]}, {'my_key': b'my_value'}))
+assert last_cb_channel == MY_CHANNEL and last_cb_message == ["SET PUBLISH1", "SET PUBLISH2"]
+
# Sets a value 'my_value2' for a key 'my_key' under given namespace only if the old value is
# 'my_value'.
was_set = _try_func_callback_return(lambda: mysdl.set_if_and_publish(