Read list type of environment variables
DBAAS Helm Charts appconfig has been changed to have individual ports
and master names for each SDL cluster due to problems seen with DBAAS
upgrade and rollback caused by re-allocation of the same address/port
of Redis to some other SDL cluster. Implement support for new list type
environment variables reading in SDL:
* DBAAS_SERVICE_PORT
* DBAAS_SERVICE_SENTINEL_PORT
* DBAAS_MASTER_NAME
Issue-Id: RIC-698
Signed-off-by: Timo Tietavainen <timo.tietavainen@nokia.com>
Change-Id: Id75e53c3542f2c2b24a2fd815a5583b1394d8d79
diff --git a/ricsdl-package/ricsdl/__init__.py b/ricsdl-package/ricsdl/__init__.py
index d8e421e..fc607ca 100644
--- a/ricsdl-package/ricsdl/__init__.py
+++ b/ricsdl-package/ricsdl/__init__.py
@@ -1,5 +1,5 @@
# Copyright (c) 2019 AT&T Intellectual Property.
-# Copyright (c) 2018-2019 Nokia.
+# Copyright (c) 2018-2022 Nokia.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@
)
-__version__ = '3.0.2'
+__version__ = '3.1.0'
__all__ = [
diff --git a/ricsdl-package/ricsdl/backend/redis.py b/ricsdl-package/ricsdl/backend/redis.py
index 3ebc8cb..822afcf 100755
--- a/ricsdl-package/ricsdl/backend/redis.py
+++ b/ricsdl-package/ricsdl/backend/redis.py
@@ -1,5 +1,5 @@
# Copyright (c) 2019 AT&T Intellectual Property.
-# Copyright (c) 2018-2019 Nokia.
+# Copyright (c) 2018-2022 Nokia.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -370,25 +370,22 @@
def __create_redis_clients(self, config):
clients = list()
cfg_params = config.get_params()
- if cfg_params.db_cluster_addr_list is None:
- clients.append(self.__create_legacy_redis_client(cfg_params))
- else:
- for addr in cfg_params.db_cluster_addr_list.split(","):
- client = self.__create_redis_client(cfg_params, addr)
- clients.append(client)
+ for i, addr in enumerate(cfg_params.db_cluster_addrs):
+ port = cfg_params.db_ports[i] if i < len(cfg_params.db_ports) else ""
+ sport = cfg_params.db_sentinel_ports[i] if i < len(cfg_params.db_sentinel_ports) else ""
+ name = cfg_params.db_sentinel_master_names[i] if i < len(cfg_params.db_sentinel_master_names) else ""
+
+ client = self.__create_redis_client(addr, port, sport, name)
+ clients.append(client)
return clients
- def __create_legacy_redis_client(self, cfg_params):
- return self.__create_redis_client(cfg_params, cfg_params.db_host)
-
- def __create_redis_client(self, cfg_params, addr):
+ def __create_redis_client(self, addr, port, sentinel_port, master_name):
new_sentinel = None
new_redis = None
- if cfg_params.db_sentinel_port is None:
- new_redis = Redis(host=addr, port=cfg_params.db_port, db=0, max_connections=20)
+ if len(sentinel_port) == 0:
+ new_redis = Redis(host=addr, port=port, db=0, max_connections=20)
else:
- sentinel_node = (addr, cfg_params.db_sentinel_port)
- master_name = cfg_params.db_sentinel_master_name
+ sentinel_node = (addr, sentinel_port)
new_sentinel = Sentinel([sentinel_node])
new_redis = new_sentinel.master_for(master_name)
diff --git a/ricsdl-package/ricsdl/configuration.py b/ricsdl-package/ricsdl/configuration.py
index e99e68e..99cde0f 100644
--- a/ricsdl-package/ricsdl/configuration.py
+++ b/ricsdl-package/ricsdl/configuration.py
@@ -1,5 +1,5 @@
# Copyright (c) 2019 AT&T Intellectual Property.
-# Copyright (c) 2018-2019 Nokia.
+# Copyright (c) 2018-2022 Nokia.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -33,9 +33,9 @@
class _Configuration():
"""This class implements Shared Data Layer (SDL) configurability."""
- Params = namedtuple('Params', ['db_host', 'db_port', 'db_sentinel_port',
- 'db_sentinel_master_name',
- 'db_cluster_addr_list', 'db_type'])
+ Params = namedtuple('Params', ['db_host', 'db_ports', 'db_sentinel_ports',
+ 'db_sentinel_master_names',
+ 'db_cluster_addrs', 'db_type'])
def __init__(self, fake_db_backend):
self.params = self._read_configuration(fake_db_backend)
@@ -44,10 +44,10 @@
return str(
{
"DB host": self.params.db_host,
- "DB port": self.params.db_port,
- "DB master sentinel": self.params.db_sentinel_master_name,
- "DB sentinel port": self.params.db_sentinel_port,
- "DB cluster address list": self.params.db_cluster_addr_list,
+ "DB ports": self.params.db_ports,
+ "DB master sentinels": self.params.db_sentinel_master_names,
+ "DB sentinel ports": self.params.db_sentinel_ports,
+ "DB cluster addresses": self.params.db_cluster_addrs,
"DB type": self.params.db_type.name,
}
)
@@ -69,14 +69,48 @@
raise ValueError(msg)
backend_type = DbBackendType.FAKE_DICT
+ host = os.getenv('DBAAS_SERVICE_HOST', "")
- return _Configuration.Params(db_host=os.getenv('DBAAS_SERVICE_HOST'),
- db_port=os.getenv('DBAAS_SERVICE_PORT'),
- db_sentinel_port=os.getenv('DBAAS_SERVICE_SENTINEL_PORT'),
- db_sentinel_master_name=os.getenv('DBAAS_MASTER_NAME'),
- db_cluster_addr_list=os.getenv('DBAAS_CLUSTER_ADDR_LIST'),
+ port_env = os.getenv('DBAAS_SERVICE_PORT')
+ ports = port_env.split(",") if port_env is not None else list()
+
+ sentinel_port_env = os.getenv('DBAAS_SERVICE_SENTINEL_PORT')
+ sentinel_ports = sentinel_port_env.split(",") if sentinel_port_env is not None else list()
+
+ sentinel_name_env = os.getenv('DBAAS_MASTER_NAME')
+ sentinel_names = sentinel_name_env.split(",") if sentinel_name_env is not None else list()
+
+ addr_env = os.getenv('DBAAS_CLUSTER_ADDR_LIST')
+ addrs = addr_env.split(",") if addr_env is not None else list()
+
+ if len(addrs) == 0 and len(host) > 0:
+ addrs.append(host)
+
+ addrs, ports, sentinel_ports, sentinel_names = cls._complete_configuration(
+ addrs, ports, sentinel_ports, sentinel_names)
+
+ return _Configuration.Params(db_host=host,
+ db_ports=ports,
+ db_sentinel_ports=sentinel_ports,
+ db_sentinel_master_names=sentinel_names,
+ db_cluster_addrs=addrs,
db_type=backend_type)
@classmethod
+ def _complete_configuration(cls, addrs, ports, sentinel_ports, sentinel_names):
+ if len(sentinel_ports) == 0:
+ if len(addrs) > len(ports) and len(ports) > 0:
+ for i in range(len(ports), len(addrs)):
+ ports.append(ports[i - 1])
+ else:
+ if len(addrs) > len(sentinel_ports):
+ for i in range(len(sentinel_ports), len(addrs)):
+ sentinel_ports.append(sentinel_ports[i - 1])
+ if len(addrs) > len(sentinel_names) and len(sentinel_names) > 0:
+ for i in range(len(sentinel_names), len(addrs)):
+ sentinel_names.append(sentinel_names[i - 1])
+ return addrs, ports, sentinel_ports, sentinel_names
+
+ @classmethod
def get_event_separator(cls):
return "___"
diff --git a/ricsdl-package/ricsdl/syncstorage.py b/ricsdl-package/ricsdl/syncstorage.py
index b15365a..62e3a7f 100755
--- a/ricsdl-package/ricsdl/syncstorage.py
+++ b/ricsdl-package/ricsdl/syncstorage.py
@@ -1,5 +1,5 @@
# Copyright (c) 2019 AT&T Intellectual Property.
-# Copyright (c) 2018-2019 Nokia.
+# Copyright (c) 2018-2022 Nokia.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -119,6 +119,7 @@
"""
def __init__(self, fake_db_backend=None) -> None:
super().__init__()
+ self.__dbbackend = None
self.__configuration = _Configuration(fake_db_backend)
self.event_separator = self.__configuration.get_event_separator()
self.__dbbackend = ricsdl.backend.get_backend_instance(self.__configuration)
@@ -141,7 +142,8 @@
return False
def close(self):
- self.__dbbackend.close()
+ if self.__dbbackend:
+ self.__dbbackend.close()
@func_arg_checker(SdlTypeError, 1, ns=str, data_map=dict)
def set(self, ns: str, data_map: Dict[str, bytes]) -> None: