Skip to content

Commit 0c7d4c3

Browse files
committed
Make a solution to getting conninfo as a string
1 parent 6716cdf commit 0c7d4c3

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

ansible_base/lib/utils/db.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
from typing import Union
44
from zlib import crc32
55

6+
import psycopg
7+
68
from django.conf import settings
79
from django.db import DEFAULT_DB_ALIAS, connection, connections, transaction
810
from django.db.backends.postgresql.base import DatabaseWrapper as PsycopgDatabaseWrapper
11+
from django.db.backends.postgresql.client import DatabaseClient as PsycopgDatabaseClient
912
from django.db.migrations.executor import MigrationExecutor
1013

1114

@@ -167,6 +170,13 @@ def psycopg_kwargs_from_settings_dict(settings_dict: dj_db_dict) -> dict:
167170
return PsycopgDatabaseWrapper(settings_dict).get_connection_params()
168171

169172

173+
def psycopg_conn_string_from_settings_dict(settings_dict: dj_db_dict) -> str:
174+
conn_params = psycopg_kwargs_from_settings_dict(settings_dict)
175+
conn_params.pop('cursor_factory')
176+
conn_params.pop('context')
177+
return psycopg.conninfo.make_conninfo(**conn_params)
178+
179+
170180
def combine_settings_dict(settings_dict1: dj_db_dict, settings_dict2: dj_db_dict, **extra_options) -> dj_db_dict:
171181
"""Given two Django settings dictionaries, combine them and return a new settings_dict"""
172182
settings_dict = deepcopy(settings_dict1)

test_app/tests/lib/utils/test_db.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
import threading
22
import time
33

4+
import psycopg
5+
46
import pytest
57
from django.db import connection
68
from django.db.utils import OperationalError
79
from django.test import override_settings
10+
from django.conf import settings
811

9-
from ansible_base.lib.utils.db import advisory_lock, get_pg_notify_params, migrations_are_complete, psycopg_kwargs_from_settings_dict
12+
from ansible_base.lib.utils.db import (
13+
advisory_lock,
14+
get_pg_notify_params,
15+
migrations_are_complete,
16+
psycopg_kwargs_from_settings_dict,
17+
psycopg_conn_string_from_settings_dict
18+
)
1019

1120

1221
@pytest.mark.django_db
@@ -81,6 +90,30 @@ def test_psycopg_kwargs_from_settings_dict(self):
8190
psycopg_params = self._trim_python_objects(psycopg_kwargs_from_settings_dict(test_dict))
8291
assert psycopg_params == self.PSYCOPG_KWARGS
8392

93+
def test_listener_string_production(self):
94+
"This is a test to correspond to PG_NOTIFY_DSN_SERVER type settings in eda-server"
95+
args = psycopg_conn_string_from_settings_dict({
96+
"ENGINE": "django.db.backends.postgresql",
97+
"HOST": "127.0.0.1",
98+
"PORT": 5432,
99+
"USER": "postgres",
100+
"PASSWORD": "DB_PASSWORD",
101+
"NAME": "eda",
102+
"TIME_ZONE": settings.DATABASES['default']['TIME_ZONE'],
103+
"OPTIONS": {
104+
"sslmode": "allow",
105+
"sslcert": "",
106+
"sslkey": "",
107+
"sslrootcert": "",
108+
},
109+
})
110+
assert args == "dbname=eda sslmode=allow sslcert='' sslkey='' sslrootcert='' client_encoding=UTF8 user=postgres password=DB_PASSWORD host=127.0.0.1 port=5432"
111+
112+
def test_listener_string_production_use(self):
113+
"This assures that the data we get for the connection string is usable, and demos how to use"
114+
args = psycopg_conn_string_from_settings_dict(settings.DATABASES['default'])
115+
psycopg.connect(conninfo=args)
116+
84117

85118
class TestAdvisoryLock:
86119
@pytest.fixture(autouse=True)
@@ -104,7 +137,7 @@ def background_task(django_db_blocker):
104137
def test_determine_lock_is_held(self, django_db_blocker):
105138
thread = threading.Thread(target=TestAdvisoryLock.background_task, args=(django_db_blocker,))
106139
thread.start()
107-
for _ in range(5):
140+
for _ in range(20):
108141
with advisory_lock('background_task_lock', wait=False) as held:
109142
if held is False:
110143
break

0 commit comments

Comments
 (0)