Skip to content

Commit ebbf545

Browse files
fix(redis): added support for ssl connections
1 parent 2c07949 commit ebbf545

2 files changed

Lines changed: 72 additions & 1 deletion

File tree

fast_healthchecks/checks/redis.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class RedisHealthCheck(HealthCheckDSN[HealthCheckResult]):
5757
_port: The port to connect to.
5858
_timeout: The timeout for the connection.
5959
_user: The user to authenticate with.
60+
_ssl: Whether to use SSL or not.
61+
_ssl_ca_certs: The path to the CA certificate.
6062
"""
6163

6264
__slots__ = (
@@ -65,6 +67,8 @@ class RedisHealthCheck(HealthCheckDSN[HealthCheckResult]):
6567
"_name",
6668
"_password",
6769
"_port",
70+
"_ssl",
71+
"_ssl_ca_certs",
6872
"_timeout",
6973
"_user",
7074
)
@@ -76,15 +80,19 @@ class RedisHealthCheck(HealthCheckDSN[HealthCheckResult]):
7680
_password: str | None
7781
_timeout: float | None
7882
_name: str
83+
_ssl: bool
84+
_ssl_ca_certs: str | None
7985

80-
def __init__( # noqa: PLR0913
86+
def __init__( # noqa: PLR0913, D417
8187
self,
8288
*,
8389
host: str = "localhost",
8490
port: int = 6379,
8591
database: str | int = 0,
8692
user: str | None = None,
8793
password: str | None = None,
94+
ssl: bool = False,
95+
ssl_ca_certs: str | None = None,
8896
timeout: float | None = DEFAULT_HC_TIMEOUT,
8997
name: str = "Redis",
9098
) -> None:
@@ -104,6 +112,8 @@ def __init__( # noqa: PLR0913
104112
self._database = database
105113
self._user = user
106114
self._password = password
115+
self._ssl = ssl
116+
self._ssl_ca_certs = ssl_ca_certs
107117
self._timeout = timeout
108118
self._name = name
109119

@@ -141,12 +151,16 @@ def from_dsn(
141151
dsn = cls.validate_dsn(dsn, type_=RedisDsn)
142152
parsed_dsn = cls.parse_dsn(dsn)
143153
parse_result = parsed_dsn["parse_result"]
154+
ssl_ca_certs: str | None = parse_result.get("ssl_ca_certs", None) # type: ignore[assignment]
155+
ssl = "ssl_ca_certs" in parse_result and bool(ssl_ca_certs)
144156
return RedisHealthCheck(
145157
host=parse_result.get("host", "localhost"),
146158
port=parse_result.get("port", 6379),
147159
database=parse_result.get("db", 0),
148160
user=parse_result.get("username"),
149161
password=parse_result.get("password"),
162+
ssl=ssl,
163+
ssl_ca_certs=ssl_ca_certs,
150164
timeout=timeout,
151165
name=name,
152166
)
@@ -166,6 +180,8 @@ async def __call__(self) -> HealthCheckResult:
166180
password=self._password,
167181
socket_timeout=self._timeout,
168182
single_connection_client=True,
183+
ssl=self._ssl,
184+
ssl_ca_certs=self._ssl_ca_certs,
169185
) as redis:
170186
healthy: bool = await redis.ping()
171187
return HealthCheckResult(name=self._name, healthy=healthy)

tests/unit/checks/test_redis.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
1616
"database": obj._database,
1717
"user": obj._user,
1818
"password": obj._password,
19+
"ssl": obj._ssl,
20+
"ssl_ca_certs": obj._ssl_ca_certs,
1921
"timeout": obj._timeout,
2022
"name": obj._name,
2123
}
@@ -32,6 +34,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
3234
"database": 0,
3335
"user": None,
3436
"password": None,
37+
"ssl": False,
38+
"ssl_ca_certs": None,
3539
"timeout": 5.0,
3640
"name": "Redis",
3741
},
@@ -47,6 +51,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
4751
"database": 0,
4852
"user": None,
4953
"password": None,
54+
"ssl": False,
55+
"ssl_ca_certs": None,
5056
"timeout": 5.0,
5157
"name": "Redis",
5258
},
@@ -63,6 +69,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
6369
"database": 0,
6470
"user": None,
6571
"password": None,
72+
"ssl": False,
73+
"ssl_ca_certs": None,
6674
"timeout": 5.0,
6775
"name": "Redis",
6876
},
@@ -80,6 +88,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
8088
"database": 1,
8189
"user": None,
8290
"password": None,
91+
"ssl": False,
92+
"ssl_ca_certs": None,
8393
"timeout": 5.0,
8494
"name": "Redis",
8595
},
@@ -97,6 +107,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
97107
"database": "test",
98108
"user": None,
99109
"password": None,
110+
"ssl": False,
111+
"ssl_ca_certs": None,
100112
"timeout": 5.0,
101113
"name": "Redis",
102114
},
@@ -115,6 +127,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
115127
"database": "test",
116128
"user": "user",
117129
"password": None,
130+
"ssl": False,
131+
"ssl_ca_certs": None,
118132
"timeout": 5.0,
119133
"name": "Redis",
120134
},
@@ -134,6 +148,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
134148
"database": "test",
135149
"user": "user",
136150
"password": "pass",
151+
"ssl": False,
152+
"ssl_ca_certs": None,
137153
"timeout": 5.0,
138154
"name": "Redis",
139155
},
@@ -154,6 +170,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
154170
"database": "test",
155171
"user": "user",
156172
"password": "pass",
173+
"ssl": False,
174+
"ssl_ca_certs": None,
157175
"timeout": 10.0,
158176
"name": "Redis",
159177
},
@@ -175,6 +193,8 @@ def to_dict(obj: RedisHealthCheck) -> dict[str, Any]:
175193
"database": "test",
176194
"user": "user",
177195
"password": "pass",
196+
"ssl": False,
197+
"ssl_ca_certs": None,
178198
"timeout": 10.0,
179199
"name": "test",
180200
},
@@ -203,6 +223,8 @@ def test_init(params: dict[str, Any], expected: dict[str, Any], exception: type[
203223
"database": 0,
204224
"user": None,
205225
"password": None,
226+
"ssl": False,
227+
"ssl_ca_certs": None,
206228
"timeout": 5.0,
207229
"name": "Redis",
208230
},
@@ -217,6 +239,8 @@ def test_init(params: dict[str, Any], expected: dict[str, Any], exception: type[
217239
"database": 1,
218240
"user": None,
219241
"password": None,
242+
"ssl": False,
243+
"ssl_ca_certs": None,
220244
"timeout": 5.0,
221245
"name": "Redis",
222246
},
@@ -231,6 +255,8 @@ def test_init(params: dict[str, Any], expected: dict[str, Any], exception: type[
231255
"database": 1,
232256
"user": "user",
233257
"password": None,
258+
"ssl": False,
259+
"ssl_ca_certs": None,
234260
"timeout": 5.0,
235261
"name": "Redis",
236262
},
@@ -245,6 +271,8 @@ def test_init(params: dict[str, Any], expected: dict[str, Any], exception: type[
245271
"database": 1,
246272
"user": "user",
247273
"password": "pass",
274+
"ssl": False,
275+
"ssl_ca_certs": None,
248276
"timeout": 5.0,
249277
"name": "Redis",
250278
},
@@ -261,6 +289,8 @@ def test_init(params: dict[str, Any], expected: dict[str, Any], exception: type[
261289
"database": 1,
262290
"user": "user",
263291
"password": "pass",
292+
"ssl": False,
293+
"ssl_ca_certs": None,
264294
"timeout": 10.0,
265295
"name": "Redis",
266296
},
@@ -278,6 +308,27 @@ def test_init(params: dict[str, Any], expected: dict[str, Any], exception: type[
278308
"database": 1,
279309
"user": "user",
280310
"password": "pass",
311+
"ssl": False,
312+
"ssl_ca_certs": None,
313+
"timeout": 10.0,
314+
"name": "test",
315+
},
316+
None,
317+
),
318+
(
319+
("redis://user:pass@localhost:6379/1?ssl_ca_certs=/root.crt",),
320+
{
321+
"timeout": 10.0,
322+
"name": "test",
323+
},
324+
{
325+
"host": "localhost",
326+
"port": 6379,
327+
"database": 1,
328+
"user": "user",
329+
"password": "pass",
330+
"ssl": True,
331+
"ssl_ca_certs": "/root.crt",
281332
"timeout": 10.0,
282333
"name": "test",
283334
},
@@ -323,6 +374,8 @@ async def test_call_success() -> None:
323374
db="test",
324375
username="user",
325376
password="pass",
377+
ssl=False,
378+
ssl_ca_certs=None,
326379
socket_timeout=10.0,
327380
single_connection_client=True,
328381
)
@@ -351,6 +404,8 @@ async def test_call_exception() -> None:
351404
db=0,
352405
username=None,
353406
password=None,
407+
ssl=False,
408+
ssl_ca_certs=None,
354409
socket_timeout=5.0,
355410
single_connection_client=True,
356411
)

0 commit comments

Comments
 (0)