Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 878b0a6

Browse files
committed
Updated redis storage to reflect flagset filter
1 parent a9270a1 commit 878b0a6

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

splitio/storage/redis.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,14 @@ def get(self, feature_flag_name): # pylint: disable=method-hidden
8989
raw = self._redis.get(self._get_key(feature_flag_name))
9090
_LOGGER.debug("Fetchting Feature flag [%s] from redis" % feature_flag_name)
9191
_LOGGER.debug(raw)
92-
return splits.from_raw(json.loads(raw)) if raw is not None else None
92+
if raw is None:
93+
return None
94+
95+
feature_flag = splits.from_raw(json.loads(raw))
96+
if self.flag_set_filter.intersect(feature_flag.sets):
97+
return feature_flag
98+
99+
return None
93100
except RedisAdapterException:
94101
_LOGGER.error('Error fetching feature flag from storage')
95102
_LOGGER.debug('Error: ', exc_info=True)
@@ -206,6 +213,9 @@ def get_split_names(self):
206213
:return: List of feature flag names.
207214
:rtype: list(str)
208215
"""
216+
if self.flag_set_filter.should_filter:
217+
return self.get_feature_flags_by_sets(self.flag_set_filter.flag_sets)
218+
209219
try:
210220
keys = self._redis.keys(self._get_key('*'))
211221
_LOGGER.debug("Fetchting feature flag names from redis: %s" % keys)
@@ -229,7 +239,12 @@ def get_all_splits(self):
229239
:return: List of all feature flags in cache.
230240
:rtype: list(splitio.models.splits.Split)
231241
"""
232-
keys = self._redis.keys(self._get_key('*'))
242+
if self.flag_set_filter.should_filter:
243+
keys = self.get_feature_flags_by_sets(self.flag_set_filter.flag_sets)
244+
else:
245+
keys = self._redis.keys(self._get_key('*'))
246+
if keys == []:
247+
return []
233248
to_return = []
234249
try:
235250
_LOGGER.debug("Fetchting all feature flags from redis: %s" % keys)

tests/storage/test_redis.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
from splitio.models.events import Event, EventWrapper
1616
from splitio.models.telemetry import MethodExceptions, MethodLatencies, TelemetryConfig, MethodExceptionsAndLatencies
1717
from splitio.storage import FlagSetsFilter
18+
from tests.integration import splits_json
19+
1820

1921
class RedisSplitStorageTests(object):
2022
"""Redis split storage test cases."""
@@ -187,6 +189,52 @@ def test_flag_sets(self, mocker):
187189
storage2 = RedisSplitStorage(adapter, True, 1, ['set2', 'set3'])
188190
assert storage2.flag_set_filter.flag_sets == set({'set2', 'set3'})
189191

192+
def test_fetching_split_with_flag_set(self, mocker):
193+
"""Test retrieving a split works."""
194+
adapter = mocker.Mock(spec=RedisAdapter)
195+
adapter.get.return_value = json.dumps(splits_json["splitChange1_1"]["splits"][0])
196+
adapter.keys.return_value = ['SPLIT_1', 'SPLIT_2']
197+
198+
def mget(keys):
199+
if keys == ['SPLIT_2']:
200+
return [json.dumps(splits_json["splitChange1_1"]["splits"][0])]
201+
if keys == ['SPLIT_2', 'SPLIT_1']:
202+
return [json.dumps(splits_json["splitChange1_1"]["splits"][0]), json.dumps(splits_json["splitChange1_1"]["splits"][1])]
203+
adapter.mget = mget
204+
205+
storage = RedisSplitStorage(adapter, config_flag_sets=['set_1'])
206+
207+
def get_feature_flags_by_sets(flag_sets):
208+
if flag_sets=={'set_1'}:
209+
return []
210+
if flag_sets=={'set2'}:
211+
return ['SPLIT_2']
212+
if flag_sets=={'set2', 'set1'}:
213+
return ['SPLIT_2', 'SPLIT_1']
214+
storage.get_feature_flags_by_sets = get_feature_flags_by_sets
215+
216+
assert storage.get('SPLIT_2') == None
217+
assert storage.get_split_names() == []
218+
assert storage.get_all_splits() == []
219+
220+
storage = RedisSplitStorage(adapter, config_flag_sets=['set2'])
221+
storage.get_feature_flags_by_sets = get_feature_flags_by_sets
222+
assert storage.get('SPLIT_2').name == 'SPLIT_2'
223+
assert storage.get_split_names() == ['SPLIT_2']
224+
splits = storage.get_all_splits()
225+
assert splits[0].name == 'SPLIT_2'
226+
assert len(splits) == 1
227+
228+
storage = RedisSplitStorage(adapter, config_flag_sets=['set2', 'set1'])
229+
storage.get_feature_flags_by_sets = get_feature_flags_by_sets
230+
assert storage.get('SPLIT_2').name == 'SPLIT_2'
231+
assert storage.get_split_names() == ['SPLIT_2', 'SPLIT_1']
232+
splits = storage.get_all_splits()
233+
assert splits[0].name == 'SPLIT_2'
234+
assert splits[1].name == 'SPLIT_1'
235+
assert len(splits) == 2
236+
237+
190238
class RedisSegmentStorageTests(object):
191239
"""Redis segment storage test cases."""
192240

0 commit comments

Comments
 (0)