Browse Source

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 <mail@georg-pfuetzenreuter.net>
Georg Pfuetzenreuter 3 months ago
parent
commit
c15e7251f7

+ 3 - 2
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"],
     )
 

+ 11 - 2
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)
 
 

+ 6 - 1
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"],

+ 6 - 2
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"])
 

+ 6 - 1
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"],

+ 9 - 3
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):