diff options
author | Rodolfo Alonso Hernandez <ralonsoh@redhat.com> | 2023-03-27 15:12:06 +0200 |
---|---|---|
committer | Rodolfo Alonso <ralonsoh@redhat.com> | 2023-03-27 14:49:25 +0000 |
commit | da4f13e7345653eba8aab5b8aceeaeff7367989e (patch) | |
tree | a881a6680363990a51541219c397ac94f71f47ba /oslo_db/sqlalchemy | |
parent | 94d6e24ca19b0116eed00d5ccdb8a538918c6dcf (diff) | |
download | oslo-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.py | 2 | ||||
-rw-r--r-- | oslo_db/sqlalchemy/provision.py | 9 | ||||
-rw-r--r-- | oslo_db/sqlalchemy/test_fixtures.py | 2 | ||||
-rw-r--r-- | oslo_db/sqlalchemy/utils.py | 8 |
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)) |