Skip to content

Commit 0289064

Browse files
authored
AAP-52587: support extended boolean values (#1390)
Support extended set of boolean values (true/false/yes/no/1/0) for MQ_TLS setting. Currently if a non-standard boolean value is used (yes/no/1/0), this can cause issues during an upgrade. [AAP-52587](https://issues.redhat.com/browse/AAP-52587) Generated with assistance from Cursor (claude-4-sonnet).
1 parent d448857 commit 0289064

File tree

3 files changed

+67
-5
lines changed

3 files changed

+67
-5
lines changed

src/aap_eda/settings/defaults.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
* - Takes precedence over host and port
6666
* MQ_HOST - Redis queue hostname (default: "127.0.0.1")
6767
* MQ_PORT - Redis queue port (default: 6379)
68-
* MQ_TLS - Force TLS on when True (default: None)
68+
* MQ_TLS - Force TLS on when True or "yes" (default: None)
6969
* MQ_DB - Redis queue database (default: 0)
7070
* MQ_USER - Redis user (default: None)
7171
* MQ_USER_PASSWORD - Redis user passed (default: None)
@@ -157,7 +157,7 @@
157157
MQ_CLIENT_CACERT_PATH: Optional[str] = None
158158
MQ_CLIENT_CERT_PATH: Optional[str] = None
159159
MQ_CLIENT_KEY_PATH: Optional[str] = None
160-
MQ_TLS: Optional[bool] = None
160+
MQ_TLS: Optional[Union[bool, str]] = None
161161
MQ_DB: int = core.DEFAULT_REDIS_DB
162162

163163
# The HA cluster hosts is a string of <host>:<port>[,<host>:port>]+

src/aap_eda/settings/post_load.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,15 @@ def post_loading(loaded_settings: Dynaconf):
460460
)
461461
settings.REDIS_CLIENT_CERT_PATH = settings.get("MQ_CLIENT_CERT_PATH", None)
462462
settings.REDIS_CLIENT_KEY_PATH = settings.get("MQ_CLIENT_KEY_PATH", None)
463-
settings.REDIS_TLS = settings.get("MQ_TLS", None)
463+
464+
# Handle MQ_TLS setting - convert string values to boolean
465+
mq_tls = settings.get("MQ_TLS", None)
466+
if mq_tls is not None and isinstance(mq_tls, str):
467+
converted_tls = utils.str_to_bool(mq_tls)
468+
settings.MQ_TLS = converted_tls
469+
settings.REDIS_TLS = converted_tls
470+
else:
471+
settings.REDIS_TLS = mq_tls
464472
settings.REDIS_DB = settings.get("MQ_DB", settings.DEFAULT_REDIS_DB)
465473
settings.REDIS_HA_CLUSTER_HOSTS = settings.get(
466474
"MQ_REDIS_HA_CLUSTER_HOSTS", ""

tests/unit/test_settings.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,17 @@ def test_duplicated_worker_queue(mock_settings):
250250
("RESOURCE_JWT_USER_ID", " eda ", "eda"),
251251
("RESOURCE_JWT_USER_ID", ["eda"], ImproperlyConfigured),
252252
("MQ_TLS", True, True),
253+
("MQ_TLS", False, False),
254+
("MQ_TLS", None, None),
255+
("MQ_TLS", "true", True),
256+
("MQ_TLS", "True", True),
257+
("MQ_TLS", "false", False),
258+
("MQ_TLS", "False", False),
259+
("MQ_TLS", "yes", True),
260+
("MQ_TLS", "no", False),
261+
("MQ_TLS", "1", True),
262+
("MQ_TLS", "0", False),
263+
("MQ_TLS", "", False),
253264
],
254265
)
255266
def test_types(mock_settings, name, value, expected):
@@ -264,10 +275,10 @@ def test_types(mock_settings, name, value, expected):
264275

265276
def test_optional_type_exception_msg(mock_settings):
266277
"""Test exception message when an optional type error occurs."""
267-
mock_settings["MQ_TLS"] = "true"
278+
mock_settings["MQ_TLS"] = 123 # Use invalid type instead of string
268279
with pytest.raises(
269280
ImproperlyConfigured,
270-
match="MQ_TLS setting must be a bool or None",
281+
match="MQ_TLS setting must be a bool or str or None",
271282
):
272283
post_loading(mock_settings)
273284

@@ -285,3 +296,46 @@ def test_union_type_exception_msg(mock_settings):
285296
def test_allow_local_resource_management(mock_settings):
286297
# default is False
287298
assert mock_settings.ALLOW_LOCAL_RESOURCE_MANAGEMENT is False
299+
300+
301+
@pytest.mark.parametrize(
302+
("mq_tls_value", "expected_redis_tls", "expected_ssl_param"),
303+
[
304+
# Boolean values
305+
(True, True, True),
306+
(False, False, False),
307+
(
308+
None,
309+
None,
310+
False,
311+
), # None should result in SSL=False (fallback logic)
312+
# String values that should be converted to True
313+
("true", True, True),
314+
("True", True, True),
315+
("yes", True, True),
316+
("Yes", True, True),
317+
("1", True, True),
318+
# String values that should be converted to False
319+
("false", False, False),
320+
("False", False, False),
321+
("no", False, False),
322+
("No", False, False),
323+
("0", False, False),
324+
("", False, False),
325+
("anything", False, False),
326+
],
327+
)
328+
def test_mq_tls_conversion_and_redis_ssl(
329+
mock_settings, mq_tls_value, expected_redis_tls, expected_ssl_param
330+
):
331+
"""Test MQ_TLS setting conversion to REDIS_TLS and SSL parameter."""
332+
mock_settings.MQ_TLS = mq_tls_value
333+
334+
post_loading(mock_settings)
335+
336+
# Check that MQ_TLS was properly converted to REDIS_TLS
337+
assert mock_settings.REDIS_TLS == expected_redis_tls
338+
339+
# Check that the Redis queue configuration uses the correct SSL parameter
340+
queues = get_rq_queues(mock_settings)
341+
assert queues["default"]["SSL"] == expected_ssl_param

0 commit comments

Comments
 (0)