Skip to content

Commit 59daa18

Browse files
authored
Merge pull request #94 from splitio/bug/ReadOnlyCluster
[SDKS-120]: Read Only Cluster
2 parents 4001485 + 5e6a612 commit 59daa18

File tree

7 files changed

+116
-34
lines changed

7 files changed

+116
-34
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var/
2323
*.egg-info/
2424
.installed.cfg
2525
*.egg
26+
.vscode
2627

2728
# PyInstaller
2829
# Usually these files are written by a python script from a template

splitio/brokers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,7 @@ def __init__(self, redis):
513513
split_fetcher = CacheBasedSplitFetcher(split_cache)
514514

515515
impressions_cache = RedisImpressionsCache(redis)
516-
delegate_treatment_log = CacheBasedTreatmentLog(impressions_cache)
517-
treatment_log = AsyncTreatmentLog(delegate_treatment_log)
516+
treatment_log = CacheBasedTreatmentLog(impressions_cache)
518517

519518
metrics_cache = RedisMetricsCache(redis)
520519
delegate_metrics = CacheBasedMetrics(metrics_cache)

splitio/redis_support.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,21 +71,25 @@ def register_segment(self, segment_name):
7171
:param segment_name: Name of the segment.
7272
:type segment_name: str
7373
'''
74-
self._redis.sadd(
75-
RedisSegmentCache._KEY_TEMPLATE.format(suffix='registered'),
76-
segment_name
77-
)
74+
# self._redis.sadd(
75+
# RedisSegmentCache._KEY_TEMPLATE.format(suffix='registered'),
76+
# segment_name
77+
# )
78+
# @TODO The Segment logic for redis should be removed.
79+
pass
7880

7981
def unregister_segment(self, segment_name):
8082
'''
8183
Unregister a segment from the automatic update process.
8284
:param segment_name: Name of the segment.
8385
:type segment_name: str
8486
'''
85-
self._redis.srem(
86-
RedisSegmentCache._KEY_TEMPLATE.format(suffix='registered'),
87-
segment_name
88-
)
87+
# self._redis.srem(
88+
# RedisSegmentCache._KEY_TEMPLATE.format(suffix='registered'),
89+
# segment_name
90+
# )
91+
# @TODO The Segment logic for redis should be removed.
92+
pass
8993

9094
def get_registered_segments(self):
9195
'''
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"splits": [
3+
{
4+
"orgId": null,
5+
"environment": null,
6+
"trafficTypeId": null,
7+
"trafficTypeName": null,
8+
"name": "test_read_only_1",
9+
"seed": -1329591480,
10+
"status": "ACTIVE",
11+
"killed": false,
12+
"defaultTreatment": "off",
13+
"changeNumber": 1325599980,
14+
"conditions": [
15+
{
16+
"matcherGroup": {
17+
"combiner": "AND",
18+
"matchers": [
19+
{
20+
"keySelector": null,
21+
"matcherType": "WHITELIST",
22+
"negate": false,
23+
"userDefinedSegmentMatcherData": null,
24+
"whitelistMatcherData": {
25+
"whitelist": [
26+
"valid"
27+
]
28+
},
29+
"unaryNumericMatcherData": null,
30+
"betweenMatcherData": null
31+
}
32+
]
33+
},
34+
"partitions": [
35+
{
36+
"treatment": "on",
37+
"size": 100
38+
}
39+
]
40+
}
41+
]
42+
}
43+
],
44+
"since": -1,
45+
"till": 1461957424937
46+
}

splitio/tests/test_clients.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,7 @@ def setUp(self):
11651165
'splitio.tests.test_clients.LocalhostBroker._build_split_fetcher')
11661166

11671167
self.open_mock = self.patch_builtin('open')
1168+
self.threading_mock = self.patch('threading.Thread')
11681169
self.broker = LocalhostBroker()
11691170

11701171
def test_skips_comment_lines(self):

splitio/tests/test_redis_cache.py

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88

99
from os.path import dirname, join
1010
from unittest import TestCase
11+
from splitio.tests.utils import MockUtilsMixin
1112
from json import load
1213

1314
from splitio.redis_support import (RedisSplitCache, RedisSegmentCache, get_redis)
15+
from redis import StrictRedis
16+
from splitio.clients import Client
17+
from splitio.prefix_decorator import PrefixDecorator
18+
from splitio.brokers import RedisBroker
1419

1520
class CacheInterfacesTests(TestCase):
1621
def setUp(self):
@@ -42,20 +47,58 @@ def test_split_cache_interface(self):
4247
self._redis_split_cache.set_change_number(1212)
4348
self.assertEqual(1212, self._redis_split_cache.get_change_number())
4449

50+
# @TODO This tests should be removed regarding that this is not supported by redis now.
51+
# def testSegmentCacheInterface(self):
52+
# with open(self._segment_changes_file_name) as f:
53+
# self._json = load(f)
54+
# segment_name = self._json['name']
55+
# segment_change_number = self._json['till']
56+
# segment_keys = self._json['added']
4557

58+
# self._redis_segment_cache.set_change_number(segment_name, segment_change_number)
59+
# self.assertEqual(segment_change_number, self._redis_segment_cache.get_change_number(segment_name))
4660

47-
def testSegmentCacheInterface(self):
48-
with open(self._segment_changes_file_name) as f:
61+
# self._redis_segment_cache.add_keys_to_segment(segment_name, segment_keys)
62+
# self.assertTrue(self._redis_segment_cache.is_in_segment(segment_name, segment_keys[0]))
63+
64+
# self._redis_segment_cache.remove_keys_from_segment(segment_name, [segment_keys[0]])
65+
# self.assertFalse(self._redis_segment_cache.is_in_segment(segment_name, segment_keys[0]))
66+
67+
class ReadOnlyRedisMock(PrefixDecorator):
68+
69+
def __init__(self, *args, **kwargs):
70+
"""
71+
Bases on PrefixDecorator.
72+
"""
73+
PrefixDecorator.__init__(self, *args, **kwargs)
74+
75+
def sadd(self, name, *values):
76+
"""
77+
Decorated sadd to simulate read only exception error.
78+
"""
79+
raise Exception('ReadOnlyError')
80+
81+
class RedisReadOnlyTest(TestCase, MockUtilsMixin):
82+
def setUp(self):
83+
self._split_changes_file_name = join(dirname(__file__), 'splitChangesReadOnly.json')
84+
85+
with open(self._split_changes_file_name) as f:
4986
self._json = load(f)
50-
segment_name = self._json['name']
51-
segment_change_number = self._json['till']
52-
segment_keys = self._json['added']
87+
split_definition = self._json['splits'][0]
88+
split_name = split_definition['name']
89+
90+
self._redis = get_redis({'redisPrefix': 'test'})
5391

54-
self._redis_segment_cache.set_change_number(segment_name, segment_change_number)
55-
self.assertEqual(segment_change_number, self._redis_segment_cache.get_change_number(segment_name))
92+
self._mocked_redis = ReadOnlyRedisMock(self._redis)
93+
self._redis_split_cache = RedisSplitCache(self._redis)
94+
self._redis_split_cache.add_split(split_name, split_definition)
95+
self._client = Client(RedisBroker(self._mocked_redis))
5696

57-
self._redis_segment_cache.add_keys_to_segment(segment_name, segment_keys)
58-
self.assertTrue(self._redis_segment_cache.is_in_segment(segment_name, segment_keys[0]))
97+
self._impression = mock.MagicMock()
98+
self._start = mock.MagicMock()
99+
self._operation = mock.MagicMock()
59100

60-
self._redis_segment_cache.remove_keys_from_segment(segment_name, [segment_keys[0]])
61-
self.assertFalse(self._redis_segment_cache.is_in_segment(segment_name, segment_keys[0]))
101+
def test_redis_read_only_mode(self):
102+
self.assertEqual(self._client.get_treatment('valid', 'test_read_only_1'), 'on')
103+
self.assertEqual(self._client.get_treatment('invalid', 'test_read_only_1'), 'off')
104+
self.assertEqual(self._client.get_treatment('valid', 'test_read_only_1_invalid'), 'control')

splitio/tests/test_redis_support.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,6 @@ def setUp(self):
3232
self.some_redis = mock.MagicMock()
3333
self.a_segment_cache = RedisSegmentCache(self.some_redis)
3434

35-
def test_unregister_segment_removes_segment_name_to_register_segments_set(self):
36-
"""Test that unregister_segment removes segment name to registered segments set"""
37-
self.a_segment_cache.unregister_segment(self.some_segment_name)
38-
self.some_redis.srem.assert_called_once_with('SPLITIO.segments.registered',
39-
self.some_segment_name)
40-
41-
def test_get_registered_segments_returns_registered_segments_set_members(self):
42-
"""Test that get_registered_segments returns the registered segments sets members"""
43-
self.assertEqual(self.some_redis.smembers.return_value,
44-
self.a_segment_cache.get_registered_segments())
45-
self.some_redis.smembers.assert_called_once_with('SPLITIO.segments.registered')
46-
4735
def test_add_keys_to_segment_adds_keys_to_segment_set(self):
4836
"""Test that add_keys_to_segment adds the keys to the segment key set"""
4937
self.a_segment_cache.add_keys_to_segment(self.some_segment_name_str, self.some_segment_keys)
@@ -88,7 +76,7 @@ def test_get_change_number_returns_default_value_if_not_set(self):
8876
self.assertEqual(-1,
8977
self.a_segment_cache.get_change_number(self.some_segment_name_str))
9078

91-
79+
9280
class RedisSplitCacheTests(TestCase, MockUtilsMixin):
9381
def setUp(self):
9482
self.decode_mock = self.patch('splitio.redis_support.decode')

0 commit comments

Comments
 (0)