From c15e7251f70b2280e272698183c10554da02d3aa Mon Sep 17 00:00:00 2001 From: Georg Pfuetzenreuter Date: Jan 25 2024 14:23:57 +0000 Subject: Support Redis Unix sockets Introduce a configuration option "REDIS_SOCKET", allowing the path to a Unix socket to be specified as an alternative to the existing, TCP/IP based, "REDIS_HOST"/"REDIS_PORT" options. Signed-off-by: Georg Pfuetzenreuter --- diff --git a/pagure/flask_app.py b/pagure/flask_app.py index cefa434..50a9ac6 100644 --- a/pagure/flask_app.py +++ b/pagure/flask_app.py @@ -51,8 +51,9 @@ if ( or pagure_config.get("PAGURE_CI_SERVICES") ): pagure.lib.query.set_redis( - host=pagure_config["REDIS_HOST"], - port=pagure_config["REDIS_PORT"], + host=pagure_config.get("REDIS_HOST", None), + port=pagure_config.get("REDIS_PORT", None), + socket=pagure_config.get("REDIS_SOCKET", None), dbname=pagure_config["REDIS_DB"], ) diff --git a/pagure/lib/query.py b/pagure/lib/query.py index ae5b3ab..c7e33c3 100644 --- a/pagure/lib/query.py +++ b/pagure/lib/query.py @@ -105,10 +105,19 @@ class Unspecified(object): pass -def set_redis(host, port, dbname): +def set_redis(host=None, port=None, socket=None, dbname=0): """Set the redis connection with the specified information.""" global REDIS - pool = redis.ConnectionPool(host=host, port=port, db=dbname) + if socket: + pool = redis.ConnectionPool( + connection_class=redis.UnixDomainSocketConnection, path=socket + ) + elif host and port: + pool = redis.ConnectionPool(host=host, port=port, db=dbname) + else: + raise pagure.exceptions.PagureException( + "Configure either REDIS_HOST and REDIS_PORT or REDIS_SOCKET" + ) REDIS = redis.StrictRedis(connection_pool=pool) diff --git a/pagure/lib/tasks.py b/pagure/lib/tasks.py index 0f32b19..c6f1042 100644 --- a/pagure/lib/tasks.py +++ b/pagure/lib/tasks.py @@ -46,7 +46,12 @@ if os.environ.get("PAGURE_BROKER_URL"): broker_url = os.environ["PAGURE_BROKER_URL"] elif pagure_config.get("BROKER_URL"): broker_url = pagure_config["BROKER_URL"] -else: +elif pagure_config.get("REDIS_SOCKET"): + broker_url = "redis+socket://%s?virtual_host=%d" % ( + pagure_config["REDIS_SOCKET"], + pagure_config["REDIS_DB"], + ) +elif "REDIS_HOST" in pagure_config and "REDIS_PORT" in pagure_config: broker_url = "redis://%s:%d/%d" % ( pagure_config["REDIS_HOST"], pagure_config["REDIS_PORT"], diff --git a/pagure/lib/tasks_mirror.py b/pagure/lib/tasks_mirror.py index 776b711..9e80060 100644 --- a/pagure/lib/tasks_mirror.py +++ b/pagure/lib/tasks_mirror.py @@ -38,14 +38,18 @@ if os.environ.get("PAGURE_BROKER_URL"): # pragma: no-cover broker_url = os.environ["PAGURE_BROKER_URL"] elif pagure_config.get("BROKER_URL"): broker_url = pagure_config["BROKER_URL"] -else: +elif pagure_config.get("REDIS_SOCKET"): + broker_url = "redis+socket://%s?virtual_host=%d" % ( + pagure_config["REDIS_SOCKET"], + pagure_config["REDIS_DB"], + ) +elif "REDIS_HOST" in pagure_config and "REDIS_PORT" in pagure_config: broker_url = "redis://%s:%d/%d" % ( pagure_config["REDIS_HOST"], pagure_config["REDIS_PORT"], pagure_config["REDIS_DB"], ) - conn = Celery("tasks_mirror", broker=broker_url, backend=broker_url) conn.conf.update(pagure_config["CELERY_CONFIG"]) diff --git a/pagure/lib/tasks_services.py b/pagure/lib/tasks_services.py index 91bce7f..d4d628e 100644 --- a/pagure/lib/tasks_services.py +++ b/pagure/lib/tasks_services.py @@ -43,7 +43,12 @@ if os.environ.get("PAGURE_BROKER_URL"): # pragma: no cover broker_url = os.environ["PAGURE_BROKER_URL"] elif pagure_config.get("BROKER_URL"): broker_url = pagure_config["BROKER_URL"] -else: +elif pagure_config.get("REDIS_SOCKET"): + broker_url = "redis+socket://%s?virtual_host=%d" % ( + pagure_config["REDIS_SOCKET"], + pagure_config["REDIS_DB"], + ) +elif "REDIS_HOST" in pagure_config and "REDIS_PORT" in pagure_config: broker_url = "redis://%s:%d/%d" % ( pagure_config["REDIS_HOST"], pagure_config["REDIS_PORT"], diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index fd8c62c..38af364 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -5229,10 +5229,16 @@ foo bar html = pagure.lib.query.text2markdown(text) self.assertEqual(html, expected) - def test_set_redis(self): - """Test the set_redis function of pagure.lib.query.""" + def test_set_redis_tcpip(self): + """Test the set_redis function of pagure.lib.query using address/port.""" self.assertIsNone(pagure.lib.query.REDIS) - pagure.lib.query.set_redis("0.0.0.0", 6379, 0) + pagure.lib.query.set_redis("0.0.0.0", 6379) + self.assertIsNotNone(pagure.lib.query.REDIS) + + def test_set_redis_unix(self): + """Test the set_redis function of pagure.lib.query using a Unix socket.""" + self.assertIsNone(pagure.lib.query.REDIS) + pagure.lib.query.set_redis(socket="/run/redis/pagure.sock") self.assertIsNotNone(pagure.lib.query.REDIS) def test_set_pagure_ci(self):