diff --git a/splitio/client/config.py b/splitio/client/config.py index 92388edf..1789e0b9 100644 --- a/splitio/client/config.py +++ b/splitio/client/config.py @@ -31,6 +31,7 @@ 'redisHost': 'localhost', 'redisPort': 6379, 'redisDb': 0, + 'redisUsername': None, 'redisPassword': None, 'redisSocketTimeout': None, 'redisSocketConnectTimeout': None, diff --git a/splitio/storage/adapters/redis.py b/splitio/storage/adapters/redis.py index 8657b317..25ecb8dc 100644 --- a/splitio/storage/adapters/redis.py +++ b/splitio/storage/adapters/redis.py @@ -357,6 +357,7 @@ def _build_default_client(config): # pylint: disable=too-many-locals host = config.get('redisHost', 'localhost') port = config.get('redisPort', 6379) database = config.get('redisDb', 0) + username = config.get('redisUsername', None) password = config.get('redisPassword', None) socket_timeout = config.get('redisSocketTimeout', None) socket_connect_timeout = config.get('redisSocketConnectTimeout', None) @@ -382,6 +383,7 @@ def _build_default_client(config): # pylint: disable=too-many-locals port=port, db=database, password=password, + username=username, socket_timeout=socket_timeout, socket_connect_timeout=socket_connect_timeout, socket_keepalive=socket_keepalive, @@ -435,6 +437,7 @@ def _build_sentinel_client(config): # pylint: disable=too-many-locals raise SentinelConfigurationException('redisMasterService must be specified.') database = config.get('redisDb', 0) + username = config.get('redisUsername', None) password = config.get('redisPassword', None) socket_timeout = config.get('redisSocketTimeout', None) socket_connect_timeout = config.get('redisSocketConnectTimeout', None) @@ -452,6 +455,7 @@ def _build_sentinel_client(config): # pylint: disable=too-many-locals sentinels, db=database, password=password, + username=username, socket_timeout=socket_timeout, socket_connect_timeout=socket_connect_timeout, socket_keepalive=socket_keepalive, diff --git a/tests/client/test_factory.py b/tests/client/test_factory.py index 0aa4187f..5ea32c9c 100644 --- a/tests/client/test_factory.py +++ b/tests/client/test_factory.py @@ -99,6 +99,7 @@ def test_redis_client_creation(self, mocker): 'redisPort': 1234, 'redisDb': 1, 'redisPassword': 'some_password', + 'redisUsername': 'redis_user', 'redisSocketTimeout': 123, 'redisSocketConnectTimeout': 123, 'redisSocketKeepalive': 123, @@ -134,6 +135,7 @@ def test_redis_client_creation(self, mocker): host='some_host', port=1234, db=1, + username='redis_user', password='some_password', socket_timeout=123, socket_connect_timeout=123, diff --git a/tests/integration/test_redis_integration.py b/tests/integration/test_redis_integration.py index 279b45a5..f76faf0f 100644 --- a/tests/integration/test_redis_integration.py +++ b/tests/integration/test_redis_integration.py @@ -8,7 +8,7 @@ from splitio.models import splits, impressions, events from splitio.storage.redis import RedisSplitStorage, RedisSegmentStorage, RedisImpressionsStorage, \ RedisEventsStorage -from splitio.storage.adapters.redis import _build_default_client +from splitio.storage.adapters.redis import _build_default_client, StrictRedis from splitio.client.config import DEFAULT_CONFIG @@ -17,7 +17,11 @@ class SplitStorageTests(object): def test_put_fetch(self): """Test storing and retrieving splits in redis.""" - adapter = _build_default_client({}) + redis = StrictRedis(host="localhost") + redis.acl_setuser(username='redis_user', enabled=True, passwords=["+split"], categories=["+admin"], + commands=["+@all"], keys=["~*"]) + redis.close() + adapter = _build_default_client({'redisUsername': 'redis_user', 'redisPassword': 'split'}) try: storage = RedisSplitStorage(adapter) with open(os.path.join(os.path.dirname(__file__), 'files', 'split_changes.json'), 'r') as flo: @@ -73,10 +77,12 @@ def test_put_fetch(self): ] for item in to_delete: adapter.delete(item) - storage = RedisSplitStorage(adapter) assert storage.is_valid_traffic_type('user') is False assert storage.is_valid_traffic_type('account') is False + redis = StrictRedis(host="localhost") + redis.acl_deluser("redis_user") + redis.close() def test_get_all(self): """Test get all names & splits.""" diff --git a/tests/storage/adapters/test_redis_adapter.py b/tests/storage/adapters/test_redis_adapter.py index cb81dfb9..ec7ddaf4 100644 --- a/tests/storage/adapters/test_redis_adapter.py +++ b/tests/storage/adapters/test_redis_adapter.py @@ -87,6 +87,7 @@ def test_adapter_building(self, mocker): 'redisHost': 'some_host', 'redisPort': 1234, 'redisDb': 0, + 'redisUsername': 'redis_user', 'redisPassword': 'some_password', 'redisSocketTimeout': 123, 'redisSocketConnectTimeout': 456, @@ -113,6 +114,7 @@ def test_adapter_building(self, mocker): host='some_host', port=1234, db=0, + username='redis_user', password='some_password', socket_timeout=123, socket_connect_timeout=456, @@ -137,6 +139,7 @@ def test_adapter_building(self, mocker): 'redisSentinels': [('123.123.123.123', 1), ('456.456.456.456', 2), ('789.789.789.789', 3)], 'redisMasterService': 'some_master', 'redisDb': 0, + 'redisUsername': 'redis_user', 'redisPassword': 'some_password', 'redisSocketTimeout': 123, 'redisSocketConnectTimeout': 456, @@ -162,6 +165,7 @@ def test_adapter_building(self, mocker): assert sentinel_mock.mock_calls[0] == mocker.call( [('123.123.123.123', 1), ('456.456.456.456', 2), ('789.789.789.789', 3)], db=0, + username='redis_user', password='some_password', socket_timeout=123, socket_connect_timeout=456,