11# Python Imports
2- import redis
2+
33from redis .exceptions import LockError , BusyLoadingError , ConnectionError , RedisError
44import pickle
55from typing import Dict , Any , Optional
99from UnleashClient import UnleashClient
1010from UnleashClient .utils import LOGGER
1111from FeatureToggle .utils import timed_lru_cache
12+ from FeatureToggle .redis_utils import RedisConnector
1213
1314
1415def split_and_strip (parameters : str ):
@@ -29,6 +30,11 @@ class FeatureToggles:
2930 __environment = None
3031 __cache = None
3132 __enable_toggle_service = True
33+ __sentinel_enabled = False
34+ __sentinels = None
35+ __sentinel_service_name = None
36+ __redis_auth_enabled = False
37+ __redis_password = None
3238
3339 @staticmethod
3440 def initialize (url : str ,
@@ -37,9 +43,15 @@ def initialize(url: str,
3743 cas_name : str ,
3844 environment : str ,
3945 redis_host : str ,
40- redis_port : str ,
41- redis_db : str ,
42- enable_toggle_service : bool = True ) -> None :
46+ redis_port : int ,
47+ redis_db : int ,
48+ enable_toggle_service : bool = True ,
49+ sentinel_enabled : bool = False ,
50+ sentinels : Optional [list ] = None ,
51+ sentinel_service_name : Optional [str ] = None ,
52+ redis_auth_enabled : bool = False ,
53+ redis_password : Optional [str ] = None
54+ ) -> None :
4355 """ Static access method. """
4456 if FeatureToggles .__client is None :
4557 FeatureToggles .__url = url
@@ -51,6 +63,11 @@ def initialize(url: str,
5163 FeatureToggles .__redis_port = redis_port
5264 FeatureToggles .__redis_db = redis_db
5365 FeatureToggles .__enable_toggle_service = enable_toggle_service
66+ FeatureToggles .__sentinel_enabled = sentinel_enabled
67+ FeatureToggles .__sentinels = sentinels
68+ FeatureToggles .__sentinel_service_name = sentinel_service_name
69+ FeatureToggles .__redis_auth_enabled = redis_auth_enabled
70+ FeatureToggles .__redis_password = redis_password
5471 FeatureToggles .__cache = FeatureToggles .__get_cache ()
5572 LOGGER .info (f'Initializing Feature toggles' )
5673 else :
@@ -62,11 +79,16 @@ def __get_cache():
6279 Create redis connection
6380 """
6481 if FeatureToggles .__cache is None :
65- FeatureToggles .__cache = redis .Redis (
66- host = FeatureToggles .__redis_host ,
67- port = FeatureToggles .__redis_port ,
68- db = FeatureToggles .__redis_db
69- )
82+ if FeatureToggles .__sentinel_enabled :
83+ FeatureToggles .__cache = RedisConnector .get_sentinel_connection (
84+ FeatureToggles .__sentinels , FeatureToggles .__sentinel_service_name , FeatureToggles .__redis_db ,
85+ FeatureToggles .__redis_auth_enabled , FeatureToggles .__redis_password
86+ )
87+ else :
88+ FeatureToggles .__cache = RedisConnector .get_non_sentinel_connection (
89+ FeatureToggles .__redis_host , FeatureToggles .__redis_port , FeatureToggles .__redis_db ,
90+ FeatureToggles .__redis_auth_enabled , FeatureToggles .__redis_password
91+ )
7092
7193 return FeatureToggles .__cache
7294
@@ -113,7 +135,12 @@ def __get_unleash_client():
113135 environment = FeatureToggles .__environment ,
114136 redis_host = FeatureToggles .__redis_host ,
115137 redis_port = FeatureToggles .__redis_port ,
116- redis_db = FeatureToggles .__redis_db
138+ redis_db = FeatureToggles .__redis_db ,
139+ sentinel_enabled = FeatureToggles .__sentinel_enabled ,
140+ sentinels = FeatureToggles .__sentinels ,
141+ sentinel_service_name = FeatureToggles .__sentinel_service_name ,
142+ redis_auth_enabled = FeatureToggles .__redis_auth_enabled ,
143+ redis_password = FeatureToggles .__redis_password
117144 )
118145 FeatureToggles .__client .initialize_client ()
119146
@@ -248,6 +275,22 @@ def fetch_feature_toggles():
248275 feature_toggles = pickle .loads (
249276 FeatureToggles .__cache .get (consts .FEATURES_URL )
250277 )
278+ """
279+ Sample output of feature_toggles
280+ [
281+ {
282+ "name": "devdanish.development.redis_auth",
283+ "strategies": [
284+ {
285+ "name": "EnableForPartners",
286+ "parameters": {
287+ "partner_names": "client1, client2"
288+ }
289+ }
290+ ]
291+ }
292+ ]
293+ """
251294 if feature_toggles :
252295 for feature_toggle in feature_toggles :
253296 full_feature_name = feature_toggle ['name' ]
@@ -267,7 +310,6 @@ def fetch_feature_toggles():
267310 # Strip CAS and ENV name from feature name
268311 active_cas_env_name = f'{ cas_name } .{ environment } .'
269312 full_feature_name = full_feature_name .replace (active_cas_env_name , '' )
270- full_feature_name = full_feature_name .replace (active_cas_env_name , '' )
271313 if full_feature_name not in response :
272314 response [full_feature_name ] = {}
273315 strategies = feature_toggle .get ('strategies' , [])
0 commit comments