Skip to content

Commit 8326138

Browse files
authored
Merge pull request #506 from splitio/development
Release 9.6.1
2 parents f96bd15 + 72a34d0 commit 8326138

File tree

10 files changed

+36
-11
lines changed

10 files changed

+36
-11
lines changed

.github/workflows/update-license-year.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- name: Checkout
16-
uses: actions/checkout@v2
16+
uses: actions/checkout@v4
1717
with:
1818
fetch-depth: 0
1919

@@ -24,7 +24,7 @@ jobs:
2424
run: "echo PREVIOUS=$(($CURRENT-1)) >> $GITHUB_ENV"
2525

2626
- name: Update LICENSE
27-
uses: jacobtomlinson/gha-find-replace@v2
27+
uses: jacobtomlinson/gha-find-replace@v3
2828
with:
2929
find: ${{ env.PREVIOUS }}
3030
replace: ${{ env.CURRENT }}
@@ -38,7 +38,7 @@ jobs:
3838
git commit -m "Updated License Year" -a
3939
4040
- name: Create Pull Request
41-
uses: peter-evans/create-pull-request@v3
41+
uses: peter-evans/create-pull-request@v5
4242
with:
4343
token: ${{ secrets.GITHUB_TOKEN }}
4444
title: Update License Year

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
9.6.1 (Feb 15, 2024)
2+
- Added redisUsername configuration parameter for Redis connection to set the username for accessing redis when not using the default `root` username
3+
14
9.6.0 (Nov 3, 2023)
25
- Added support for Flag Sets on the SDK, which enables grouping feature flags and interacting with the group rather than individually (more details in our documentation):
36
- Added new variations of the get treatment methods to support evaluating flags in given flag set/s.

LICENSE.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright © 2023 Split Software, Inc.
1+
Copyright © 2024 Split Software, Inc.
22

33
Licensed under the Apache License, Version 2.0 (the "License");
44
you may not use this file except in compliance with the License.

splitio/client/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
'redisHost': 'localhost',
3232
'redisPort': 6379,
3333
'redisDb': 0,
34+
'redisUsername': None,
3435
'redisPassword': None,
3536
'redisSocketTimeout': None,
3637
'redisSocketConnectTimeout': None,

splitio/client/factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ def _build_redis_factory(api_key, cfg):
441441
cache_enabled = cfg.get('redisLocalCacheEnabled', False)
442442
cache_ttl = cfg.get('redisLocalCacheTTL', 5)
443443
storages = {
444-
'splits': RedisSplitStorage(redis_adapter, cache_enabled, cache_ttl, cfg['flagSetsFilter'] if cfg['flagSetsFilter'] is not None else []),
444+
'splits': RedisSplitStorage(redis_adapter, cache_enabled, cache_ttl, []),
445445
'segments': RedisSegmentStorage(redis_adapter),
446446
'impressions': RedisImpressionsStorage(redis_adapter, sdk_metadata),
447447
'events': RedisEventsStorage(redis_adapter, sdk_metadata),
@@ -524,7 +524,7 @@ def _build_pluggable_factory(api_key, cfg):
524524
pluggable_adapter = cfg.get('storageWrapper')
525525
storage_prefix = cfg.get('storagePrefix')
526526
storages = {
527-
'splits': PluggableSplitStorage(pluggable_adapter, storage_prefix, cfg['flagSetsFilter'] if cfg['flagSetsFilter'] is not None else []),
527+
'splits': PluggableSplitStorage(pluggable_adapter, storage_prefix, []),
528528
'segments': PluggableSegmentStorage(pluggable_adapter, storage_prefix),
529529
'impressions': PluggableImpressionsStorage(pluggable_adapter, sdk_metadata, storage_prefix),
530530
'events': PluggableEventsStorage(pluggable_adapter, sdk_metadata, storage_prefix),

splitio/storage/adapters/redis.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ def _build_default_client(config): # pylint: disable=too-many-locals
357357
host = config.get('redisHost', 'localhost')
358358
port = config.get('redisPort', 6379)
359359
database = config.get('redisDb', 0)
360+
username = config.get('redisUsername', None)
360361
password = config.get('redisPassword', None)
361362
socket_timeout = config.get('redisSocketTimeout', None)
362363
socket_connect_timeout = config.get('redisSocketConnectTimeout', None)
@@ -382,6 +383,7 @@ def _build_default_client(config): # pylint: disable=too-many-locals
382383
port=port,
383384
db=database,
384385
password=password,
386+
username=username,
385387
socket_timeout=socket_timeout,
386388
socket_connect_timeout=socket_connect_timeout,
387389
socket_keepalive=socket_keepalive,
@@ -435,6 +437,7 @@ def _build_sentinel_client(config): # pylint: disable=too-many-locals
435437
raise SentinelConfigurationException('redisMasterService must be specified.')
436438

437439
database = config.get('redisDb', 0)
440+
username = config.get('redisUsername', None)
438441
password = config.get('redisPassword', None)
439442
socket_timeout = config.get('redisSocketTimeout', None)
440443
socket_connect_timeout = config.get('redisSocketConnectTimeout', None)
@@ -452,6 +455,7 @@ def _build_sentinel_client(config): # pylint: disable=too-many-locals
452455
sentinels,
453456
db=database,
454457
password=password,
458+
username=username,
455459
socket_timeout=socket_timeout,
456460
socket_connect_timeout=socket_connect_timeout,
457461
socket_keepalive=socket_keepalive,

splitio/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '9.6.0'
1+
__version__ = '9.6.1'

tests/client/test_factory.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def test_redis_client_creation(self, mocker):
9999
'redisPort': 1234,
100100
'redisDb': 1,
101101
'redisPassword': 'some_password',
102+
'redisUsername': 'redis_user',
102103
'redisSocketTimeout': 123,
103104
'redisSocketConnectTimeout': 123,
104105
'redisSocketKeepalive': 123,
@@ -115,13 +116,16 @@ def test_redis_client_creation(self, mocker):
115116
'redisSslCertReqs': 'some_cert_req',
116117
'redisSslCaCerts': 'some_ca_cert',
117118
'redisMaxConnections': 999,
119+
'flagSetsFilter': ['set_1']
118120
}
119121
factory = get_factory('some_api_key', config=config)
120122
assert isinstance(factory._get_storage('splits'), redis.RedisSplitStorage)
121123
assert isinstance(factory._get_storage('segments'), redis.RedisSegmentStorage)
122124
assert isinstance(factory._get_storage('impressions'), redis.RedisImpressionsStorage)
123125
assert isinstance(factory._get_storage('events'), redis.RedisEventsStorage)
124126

127+
assert factory._get_storage('splits').flag_set_filter.flag_sets == set([])
128+
125129
adapter = factory._get_storage('splits')._redis
126130
assert adapter == factory._get_storage('segments')._redis
127131
assert adapter == factory._get_storage('impressions')._redis
@@ -131,6 +135,7 @@ def test_redis_client_creation(self, mocker):
131135
host='some_host',
132136
port=1234,
133137
db=1,
138+
username='redis_user',
134139
password='some_password',
135140
socket_timeout=123,
136141
socket_connect_timeout=123,
@@ -569,13 +574,15 @@ def test_pluggable_client_creation(self, mocker):
569574
'labelsEnabled': False,
570575
'impressionListener': 123,
571576
'storageType': 'pluggable',
572-
'storageWrapper': StorageMockAdapter()
577+
'storageWrapper': StorageMockAdapter(),
578+
'flagSetsFilter': ['set_1']
573579
}
574580
factory = get_factory('some_api_key', config=config)
575581
assert isinstance(factory._get_storage('splits'), pluggable.PluggableSplitStorage)
576582
assert isinstance(factory._get_storage('segments'), pluggable.PluggableSegmentStorage)
577583
assert isinstance(factory._get_storage('impressions'), pluggable.PluggableImpressionsStorage)
578584
assert isinstance(factory._get_storage('events'), pluggable.PluggableEventsStorage)
585+
assert factory._get_storage('splits').flag_set_filter.flag_sets == set([])
579586

580587
adapter = factory._get_storage('splits')._pluggable_adapter
581588
assert adapter == factory._get_storage('segments')._pluggable_adapter

tests/integration/test_redis_integration.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from splitio.models import splits, impressions, events
99
from splitio.storage.redis import RedisSplitStorage, RedisSegmentStorage, RedisImpressionsStorage, \
1010
RedisEventsStorage
11-
from splitio.storage.adapters.redis import _build_default_client
11+
from splitio.storage.adapters.redis import _build_default_client, StrictRedis
1212
from splitio.client.config import DEFAULT_CONFIG
1313

1414

@@ -17,7 +17,11 @@ class SplitStorageTests(object):
1717

1818
def test_put_fetch(self):
1919
"""Test storing and retrieving splits in redis."""
20-
adapter = _build_default_client({})
20+
redis = StrictRedis(host="localhost")
21+
redis.acl_setuser(username='redis_user', enabled=True, passwords=["+split"], categories=["+admin"],
22+
commands=["+@all"], keys=["~*"])
23+
redis.close()
24+
adapter = _build_default_client({'redisUsername': 'redis_user', 'redisPassword': 'split'})
2125
try:
2226
storage = RedisSplitStorage(adapter)
2327
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):
7377
]
7478
for item in to_delete:
7579
adapter.delete(item)
76-
7780
storage = RedisSplitStorage(adapter)
7881
assert storage.is_valid_traffic_type('user') is False
7982
assert storage.is_valid_traffic_type('account') is False
83+
redis = StrictRedis(host="localhost")
84+
redis.acl_deluser("redis_user")
85+
redis.close()
8086

8187
def test_get_all(self):
8288
"""Test get all names & splits."""

tests/storage/adapters/test_redis_adapter.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def test_adapter_building(self, mocker):
8787
'redisHost': 'some_host',
8888
'redisPort': 1234,
8989
'redisDb': 0,
90+
'redisUsername': 'redis_user',
9091
'redisPassword': 'some_password',
9192
'redisSocketTimeout': 123,
9293
'redisSocketConnectTimeout': 456,
@@ -113,6 +114,7 @@ def test_adapter_building(self, mocker):
113114
host='some_host',
114115
port=1234,
115116
db=0,
117+
username='redis_user',
116118
password='some_password',
117119
socket_timeout=123,
118120
socket_connect_timeout=456,
@@ -137,6 +139,7 @@ def test_adapter_building(self, mocker):
137139
'redisSentinels': [('123.123.123.123', 1), ('456.456.456.456', 2), ('789.789.789.789', 3)],
138140
'redisMasterService': 'some_master',
139141
'redisDb': 0,
142+
'redisUsername': 'redis_user',
140143
'redisPassword': 'some_password',
141144
'redisSocketTimeout': 123,
142145
'redisSocketConnectTimeout': 456,
@@ -162,6 +165,7 @@ def test_adapter_building(self, mocker):
162165
assert sentinel_mock.mock_calls[0] == mocker.call(
163166
[('123.123.123.123', 1), ('456.456.456.456', 2), ('789.789.789.789', 3)],
164167
db=0,
168+
username='redis_user',
165169
password='some_password',
166170
socket_timeout=123,
167171
socket_connect_timeout=456,

0 commit comments

Comments
 (0)