From af6649bb7cfafc477856d0cb3545dd5eda2be351 Mon Sep 17 00:00:00 2001 From: Nikita Ekaterinchuk Date: Mon, 1 Sep 2025 14:55:37 +0300 Subject: [PATCH] Allow SSL support for Sentinel --- arq/connections.py | 24 ++++++++++++++---------- tests/test_utils.py | 4 +++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/arq/connections.py b/arq/connections.py index c1058890..e0d1f07b 100644 --- a/arq/connections.py +++ b/arq/connections.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from datetime import datetime, timedelta from operator import attrgetter -from typing import TYPE_CHECKING, Any, Callable, List, Optional, Tuple, Union, cast +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union, cast from urllib.parse import parse_qs, urlparse from uuid import uuid4 @@ -48,6 +48,7 @@ class RedisSettings: sentinel: bool = False sentinel_master: str = 'mymaster' + sentinel_kwargs: Optional[Dict[str, Any]] = None retry_on_timeout: bool = False retry_on_error: Optional[List[Exception]] = None @@ -242,7 +243,7 @@ def pool_factory(*args: Any, **kwargs: Any) -> ArqRedis: client = Sentinel( # type: ignore[misc] *args, sentinels=settings.host, - ssl=settings.ssl, + sentinel_kwargs=settings.sentinel_kwargs, **kwargs, ) redis = client.master_for(settings.sentinel_master, redis_class=ArqRedis) @@ -255,13 +256,6 @@ def pool_factory(*args: Any, **kwargs: Any) -> ArqRedis: port=settings.port, unix_socket_path=settings.unix_socket_path, socket_connect_timeout=settings.conn_timeout, - ssl=settings.ssl, - ssl_keyfile=settings.ssl_keyfile, - ssl_certfile=settings.ssl_certfile, - ssl_cert_reqs=settings.ssl_cert_reqs, - ssl_ca_certs=settings.ssl_ca_certs, - ssl_ca_data=settings.ssl_ca_data, - ssl_check_hostname=settings.ssl_check_hostname, retry=settings.retry, retry_on_timeout=settings.retry_on_timeout, retry_on_error=settings.retry_on_error, @@ -271,7 +265,17 @@ def pool_factory(*args: Any, **kwargs: Any) -> ArqRedis: while True: try: pool = pool_factory( - db=settings.database, username=settings.username, password=settings.password, encoding='utf8' + db=settings.database, + username=settings.username, + password=settings.password, + encoding='utf8', + ssl=settings.ssl, + ssl_keyfile=settings.ssl_keyfile, + ssl_certfile=settings.ssl_certfile, + ssl_cert_reqs=settings.ssl_cert_reqs, + ssl_ca_certs=settings.ssl_ca_certs, + ssl_ca_data=settings.ssl_ca_data, + ssl_check_hostname=settings.ssl_check_hostname, ) pool.job_serializer = job_serializer pool.job_deserializer = job_deserializer diff --git a/tests/test_utils.py b/tests/test_utils.py index 96c9a25c..42417edd 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -22,7 +22,7 @@ def test_settings_changed(): "RedisSettings(host='localhost', port=123, unix_socket_path=None, database=0, username=None, password=None, " "ssl=False, ssl_keyfile=None, ssl_certfile=None, ssl_cert_reqs='required', ssl_ca_certs=None, " 'ssl_ca_data=None, ssl_check_hostname=False, conn_timeout=1, conn_retries=5, conn_retry_delay=1, ' - "max_connections=None, sentinel=False, sentinel_master='mymaster', " + "max_connections=None, sentinel=False, sentinel_master='mymaster', sentinel_kwargs=None, " 'retry_on_timeout=False, retry_on_error=None, retry=None)' ) == str(settings) @@ -220,6 +220,7 @@ def test_settings_plain(): 'conn_retries': 5, 'conn_retry_delay': 1, 'sentinel': False, + 'sentinel_kwargs': None, 'sentinel_master': 'mymaster', 'retry_on_timeout': False, 'retry_on_error': None, @@ -249,6 +250,7 @@ def test_settings_from_socket_dsn(): 'conn_retries': 5, 'conn_retry_delay': 1, 'sentinel': False, + 'sentinel_kwargs': None, 'sentinel_master': 'mymaster', 'retry_on_timeout': False, 'retry_on_error': None,