Skip to content

Commit b5df9bf

Browse files
authored
Merge pull request #298 from alaminopu/feat/add-support-redis-credential-provider
feat: add support for redis credential provider
2 parents 09dda96 + 4254cb1 commit b5df9bf

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ tox-*.xml
5555
# Django stuff:
5656
*.log
5757

58+
# ide/editor
59+
.idea/
60+
.vscode/
61+
5862
# Sphinx documentation
5963
docs/_build/
6064

redbeat/schedulers.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,19 @@ def get_redis(app=None):
147147
ssl_options = {'ssl_cert_reqs': ssl.CERT_REQUIRED}
148148
if isinstance(conf.redis_use_ssl, dict):
149149
ssl_options.update(conf.redis_use_ssl)
150-
connection = StrictRedis.from_url(conf.redis_url, decode_responses=True, **ssl_options)
150+
extras = {"decode_responses": True, **ssl_options, **redis_options}
151+
connection = StrictRedis.from_url(conf.redis_url, **extras)
151152
elif conf.redis_url.startswith('redis-cluster'):
152153
from rediscluster import RedisCluster
153154

154155
if not redis_options.get('startup_nodes'):
155-
redis_options = {'startup_nodes': [{"host": "localhost", "port": "30001"}]}
156-
connection = RedisCluster(decode_responses=True, **redis_options)
156+
startup_nodes_options = {'startup_nodes': [{"host": "localhost", "port": "30001"}]}
157+
redis_options.update(startup_nodes_options)
158+
redis_options.update({"decode_responses": True})
159+
connection = RedisCluster(**redis_options)
157160
else:
158-
connection = StrictRedis.from_url(conf.redis_url, decode_responses=True)
161+
redis_options.update({"decode_responses": True})
162+
connection = StrictRedis.from_url(conf.redis_url, **redis_options)
159163

160164
if connection:
161165
_set_redbeat_connect(app, REDBEAT_REDIS_KEY, connection, retry_period)

tests/test_scheduler.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from celery.beat import DEFAULT_MAX_INTERVAL
1010
from celery.schedules import schedstate, schedule
1111
from celery.utils.time import maybe_timedelta
12+
from redis import CredentialProvider
1213
from redis.exceptions import ConnectionError
1314

1415
from redbeat import RedBeatScheduler
@@ -389,6 +390,42 @@ def test_ssl_connection_scheduler(self):
389390
assert 'ssl_ca_certs' not in redis_client.connection_pool.connection_kwargs
390391

391392

393+
class RedisWithCredentialProvider(AppCase):
394+
class UserCredProvider(CredentialProvider):
395+
def __init__(self, username, password):
396+
self.username = username
397+
self.password = password
398+
399+
def get_credential(self):
400+
return self.username, self.password
401+
402+
config_dict = {
403+
'REDBEAT_KEY_PREFIX': 'rb-tests:',
404+
'REDBEAT_REDIS_URL': 'rediss://redishost:26379/0',
405+
'REDBEAT_REDIS_OPTIONS': {
406+
'credential_provider': UserCredProvider("test_user", "test_pass")
407+
},
408+
'REDBEAT_REDIS_USE_SSL': True,
409+
}
410+
411+
def setup(self): # celery3
412+
self.app.conf.add_defaults(deepcopy(self.config_dict))
413+
414+
def test_redis_with_credential_provider_scheduler(self):
415+
redis_client = get_redis(app=self.app)
416+
417+
# existing ssl checks
418+
assert 'SSLConnection' in str(redis_client.connection_pool)
419+
assert redis_client.connection_pool.connection_kwargs['ssl_cert_reqs'] == ssl.CERT_REQUIRED
420+
421+
# check for credential provider
422+
assert 'username' not in redis_client.connection_pool.connection_kwargs
423+
assert 'password' not in redis_client.connection_pool.connection_kwargs
424+
assert 'credential_provider' in redis_client.connection_pool.connection_kwargs
425+
cred_provider = redis_client.connection_pool.connection_kwargs['credential_provider']
426+
assert isinstance(cred_provider, CredentialProvider)
427+
428+
392429
class RedBeatLockTimeoutDefaultValues(RedBeatCase):
393430
def test_no_values(self):
394431
scheduler = RedBeatScheduler(app=self.app)

0 commit comments

Comments
 (0)