Skip to content

Commit 9a70a36

Browse files
authored
Merge pull request #148 from splitio/feature/redisTLSStupport
Feature/redis tls stupport
2 parents 5117708 + d56971b commit 9a70a36

File tree

6 files changed

+52
-3
lines changed

6 files changed

+52
-3
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
8.1.2 (TBD)
2+
- Validated TLS support for redis connections
3+
- Fixed traffic type count issue
14
8.1.1 (14 Jun, 2019)
25
- Fixed python3 compatibility issue in uwsgi caching mode.
36
8.1.0 (3 Jun, 2019)

splitio/storage/adapters/redis.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ def original_exception(self):
4848

4949

5050
class SentinelConfigurationException(Exception):
51+
"""Exception to be raised when sentinel config options are incorrect."""
52+
5153
pass
5254

5355

@@ -367,6 +369,9 @@ def _build_sentinel_client(config): #pylint: disable=too-many-locals
367369
"""
368370
sentinels = config.get('redisSentinels')
369371

372+
if config.get('redisSsl', False):
373+
raise SentinelConfigurationException('Redis Sentinel cannot be used with SSL/TLS.')
374+
370375
if sentinels is None:
371376
raise SentinelConfigurationException('redisSentinels must be specified.')
372377
if not isinstance(sentinels, list):

splitio/storage/inmemmory.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def put(self, split):
4444
:type split: splitio.models.split.Split
4545
"""
4646
with self._lock:
47+
if split.name in self._splits:
48+
self._decrease_traffic_type_count(self._splits[split.name].traffic_type_name)
4749
self._splits[split.name] = split
4850
self._increase_traffic_type_count(split.traffic_type_name)
4951

splitio/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '8.1.1'
1+
__version__ = '8.1.2-rc1'

tests/storage/adapters/test_redis_adapter.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Redis storage adapter test module."""
22

3-
3+
import pytest
44
from splitio.storage.adapters import redis
55
from redis import StrictRedis
66
from redis.sentinel import Sentinel
@@ -145,7 +145,7 @@ def test_adapter_building(self, mocker):
145145
'redisErrors': 'abc',
146146
'redisDecodeResponses': True,
147147
'redisRetryOnTimeout': True,
148-
'redisSsl': True,
148+
'redisSsl': False,
149149
'redisSslKeyfile': '/ssl.cert',
150150
'redisSslCertfile': '/ssl2.cert',
151151
'redisSslCertReqs': 'abc',
@@ -170,3 +170,11 @@ def test_adapter_building(self, mocker):
170170
retry_on_timeout=True,
171171
max_connections=5
172172
)
173+
174+
def test_sentinel_ssl_fails(self):
175+
"""Test that SSL/TLS & Sentinel don't return a valid client."""
176+
with pytest.raises(redis.SentinelConfigurationException) as exc:
177+
redis.build({
178+
'redisSentinels': ['a', 'b'],
179+
'redisSsl': True,
180+
})

tests/storage/test_inmemory_storage.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,37 @@ def test_is_valid_traffic_type(self, mocker):
121121
assert storage.is_valid_traffic_type('user') is False
122122
assert storage.is_valid_traffic_type('account') is False
123123

124+
def test_traffic_type_inc_dec_logic(self, mocker):
125+
"""Test that adding/removing split, handles traffic types correctly."""
126+
storage = InMemorySplitStorage()
127+
128+
split1 = mocker.Mock()
129+
name1_prop = mocker.PropertyMock()
130+
name1_prop.return_value = 'split1'
131+
type(split1).name = name1_prop
132+
133+
split2 = mocker.Mock()
134+
name2_prop = mocker.PropertyMock()
135+
name2_prop.return_value = 'split1'
136+
type(split2).name = name2_prop
137+
138+
tt_user = mocker.PropertyMock()
139+
tt_user.return_value = 'user'
140+
141+
tt_account = mocker.PropertyMock()
142+
tt_account.return_value = 'account'
143+
144+
type(split1).traffic_type_name = tt_user
145+
type(split2).traffic_type_name = tt_account
146+
147+
storage.put(split1)
148+
assert storage.is_valid_traffic_type('user') is True
149+
assert storage.is_valid_traffic_type('account') is False
150+
151+
storage.put(split2)
152+
assert storage.is_valid_traffic_type('user') is False
153+
assert storage.is_valid_traffic_type('account') is True
154+
124155

125156
class InMemorySegmentStorageTests(object):
126157
"""In memory segment storage tests."""

0 commit comments

Comments
 (0)