summaryrefslogtreecommitdiff
path: root/oslo_db/sqlalchemy
diff options
context:
space:
mode:
authorRodolfo Alonso Hernandez <ralonsoh@redhat.com>2023-03-27 15:12:06 +0200
committerRodolfo Alonso <ralonsoh@redhat.com>2023-03-27 14:49:25 +0000
commitda4f13e7345653eba8aab5b8aceeaeff7367989e (patch)
treea881a6680363990a51541219c397ac94f71f47ba /oslo_db/sqlalchemy
parent94d6e24ca19b0116eed00d5ccdb8a538918c6dcf (diff)
downloadoslo-db-da4f13e7345653eba8aab5b8aceeaeff7367989e.tar.gz
Do not convert to string ``url.URL`` objects
The SQLAlchemy method ``url.make_url`` accepts strings and ``url.URL`` object types. By default, oslo.db was converting any object to string before calling ``url.make_url``, that parses this string. Since SQLAlchemy 2.0, the ``url.URL.__str__`` method is removed and the ``url.URL.__repr__`` method returns a string with the password hidden. The new utility method checks what type of object is passed and only if the object is not a string nor a ``url.URL`` object, is converted to a string. Closes-Bug: #2012928 Change-Id: I84f13f378f83e2a55078370ae2b4787f00982c23
Diffstat (limited to 'oslo_db/sqlalchemy')
-rw-r--r--oslo_db/sqlalchemy/engines.py2
-rw-r--r--oslo_db/sqlalchemy/provision.py9
-rw-r--r--oslo_db/sqlalchemy/test_fixtures.py2
-rw-r--r--oslo_db/sqlalchemy/utils.py8
4 files changed, 14 insertions, 7 deletions
diff --git a/oslo_db/sqlalchemy/engines.py b/oslo_db/sqlalchemy/engines.py
index 31dabf6..4634ce5 100644
--- a/oslo_db/sqlalchemy/engines.py
+++ b/oslo_db/sqlalchemy/engines.py
@@ -181,7 +181,7 @@ def create_engine(sql_connection, sqlite_fk=False, mysql_sql_mode=None,
json_deserializer=None, connection_parameters=None):
"""Return a new SQLAlchemy engine."""
- url = sqlalchemy.engine.url.make_url(sql_connection)
+ url = utils.make_url(sql_connection)
if connection_parameters:
url = _extend_url_parameters(url, connection_parameters)
diff --git a/oslo_db/sqlalchemy/provision.py b/oslo_db/sqlalchemy/provision.py
index 21eb90a..a4830b6 100644
--- a/oslo_db/sqlalchemy/provision.py
+++ b/oslo_db/sqlalchemy/provision.py
@@ -24,7 +24,6 @@ import re
import string
import sqlalchemy
-from sqlalchemy.engine import url as sa_url
from sqlalchemy import schema
from sqlalchemy import sql
import testresources
@@ -259,7 +258,7 @@ class Backend(object):
@classmethod
def _ensure_backend_available(cls, url):
- url = sa_url.make_url(str(url))
+ url = utils.make_url(url)
try:
eng = sqlalchemy.create_engine(url)
except ImportError as i_e:
@@ -362,7 +361,7 @@ class Backend(object):
]
for url_str in configured_urls:
- url = sa_url.make_url(url_str)
+ url = utils.make_url(url_str)
m = re.match(r'([^+]+?)(?:\+(.+))?$', url.drivername)
database_type = m.group(1)
Backend.backends_by_database_type[database_type] = \
@@ -495,7 +494,7 @@ class BackendImpl(object, metaclass=abc.ABCMeta):
"""
- url = sa_url.make_url(str(base_url))
+ url = utils.make_url(base_url)
# TODO(zzzeek): remove hasattr() conditional in favor of "url.set()"
# when SQLAlchemy 1.4 is the minimum version in requirements
@@ -571,7 +570,7 @@ class SQLiteBackendImpl(BackendImpl):
def provisioned_database_url(self, base_url, ident):
if base_url.database:
- return sa_url.make_url("sqlite:////tmp/%s.db" % ident)
+ return utils.make_url("sqlite:////tmp/%s.db" % ident)
else:
return base_url
diff --git a/oslo_db/sqlalchemy/test_fixtures.py b/oslo_db/sqlalchemy/test_fixtures.py
index 8b69d3f..f7157c0 100644
--- a/oslo_db/sqlalchemy/test_fixtures.py
+++ b/oslo_db/sqlalchemy/test_fixtures.py
@@ -360,7 +360,7 @@ class AdHocDbFixture(SimpleDbFixture):
"""
def __init__(self, url=None):
if url:
- self.url = provision.sa_url.make_url(str(url))
+ self.url = utils.make_url(url)
driver = self.url.get_backend_name()
else:
driver = None
diff --git a/oslo_db/sqlalchemy/utils.py b/oslo_db/sqlalchemy/utils.py
index ba0a607..b539b6d 100644
--- a/oslo_db/sqlalchemy/utils.py
+++ b/oslo_db/sqlalchemy/utils.py
@@ -1051,3 +1051,11 @@ def suspend_fk_constraints_for_col_alter(
deferrable=fk['options'].get('deferrable'),
initially=fk['options'].get('initially'),
)
+
+
+def make_url(target):
+ """Return a ``url.URL`` object"""
+ if isinstance(target, (str, sa_url.URL)):
+ return sa_url.make_url(target)
+ else:
+ return sa_url.make_url(str(target))