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/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 "___"