No way to set SSL parameters with pymysql

Bug #1882844 reported by David Ames
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
oslo.db
Invalid
Undecided
David Ames
python-oslo.db (Ubuntu)
Invalid
High
Unassigned

Bug Description

There is no way to pass SSL parameters from oslo.db through sqlalchemy to pymysql.

pymsyql is expecting a parameter, "ssl" to be a dictionary of the form:

ssl= {
  "ca": "/path/to/ca.pem",
  "capath": "/path/to/cas/",
  "cert": "/path/to/cert.pem",
  "key": "/path/to/key.pem",
  "cipher": "tls_1.2",
  "check_hostname: False,
}

Steps to reproduce:
Examples use:
python3-keystone 2:17.0.0-0ubuntu0.20.04.1
python3-oslo.db 8.1.0-0ubuntu1

If connection parameters set several of these items, then the following warning occurs and DB access fails.

connection_parameters = ssl=True&ca=/etc/ssl/certs/ca-certificates.crt

(keystone.server.flask.application): 2020-06-09 20:34:10,159 WARNING __init__() got an unexpected keyword argument 'ca'

If only attempting to turn on ssl, then the following traceback occurs because it is a str not a dict.

connection_parameters = ssl=True

020-06-09 20:35:50.110184 Traceback (most recent call last):
2020-06-09 20:35:50.110644 File "/usr/lib/python3/dist-packages/keystone/notifications.py", line 573, in wrapper
2020-06-09 20:35:50.110733 result = f(wrapped_self, user_id, *args, **kwargs)
2020-06-09 20:35:50.110804 File "/usr/lib/python3/dist-packages/keystone/identity/core.py", line 414, in wrapper
2020-06-09 20:35:50.110862 return f(self, *args, **kwargs)
2020-06-09 20:35:50.110922 File "/usr/lib/python3/dist-packages/keystone/identity/core.py", line 424, in wrapper
2020-06-09 20:35:50.110988 return f(self, *args, **kwargs)
2020-06-09 20:35:50.111064 File "/usr/lib/python3/dist-packages/keystone/identity/core.py", line 903, in authenticate
2020-06-09 20:35:50.111130 ref = driver.authenticate(entity_id, password)
2020-06-09 20:35:50.111191 File "/usr/lib/python3/dist-packages/keystone/identity/backends/sql.py", line 59, in authenticate
2020-06-09 20:35:50.117473 with sql.session_for_read() as session:
2020-06-09 20:35:50.117713 File "/usr/lib/python3.8/contextlib.py", line 113, in __enter__
2020-06-09 20:35:50.117878 return next(self.gen)
2020-06-09 20:35:50.118071 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 1058, in _transaction_scope
2020-06-09 20:35:50.118201 with current._produce_block(
2020-06-09 20:35:50.118357 File "/usr/lib/python3.8/contextlib.py", line 113, in __enter__
2020-06-09 20:35:50.118572 return next(self.gen)
2020-06-09 20:35:50.118693 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 657, in _session
2020-06-09 20:35:50.118771 self.session = self.factory._create_session(
2020-06-09 20:35:50.118876 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 418, in _create_session
2020-06-09 20:35:50.118955 self._start()
2020-06-09 20:35:50.119079 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 508, in _start
2020-06-09 20:35:50.119157 self._setup_for_connection(
2020-06-09 20:35:50.119349 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 533, in _setup_for_connection
2020-06-09 20:35:50.119542 engine = engines.create_engine(
2020-06-09 20:35:50.119738 File "/usr/lib/python3/dist-packages/debtcollector/renames.py", line 43, in decorator
2020-06-09 20:35:50.119861 return wrapped(*args, **kwargs)
2020-06-09 20:35:50.120012 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/engines.py", line 201, in create_engine
2020-06-09 20:35:50.120135 test_conn = _test_connection(engine, max_retries, retry_interval)
2020-06-09 20:35:50.120267 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/engines.py", line 376, in _test_connection
2020-06-09 20:35:50.120390 return engine.connect()
2020-06-09 20:35:50.120609 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 2209, in connect
2020-06-09 20:35:50.120733 return self._connection_cls(self, **kwargs)
2020-06-09 20:35:50.120882 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 103, in __init__
2020-06-09 20:35:50.121013 else engine.raw_connection()
2020-06-09 20:35:50.121110 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 2306, in raw_connection
2020-06-09 20:35:50.121185 return self._wrap_pool_connect(
2020-06-09 20:35:50.121282 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 2276, in _wrap_pool_connect
2020-06-09 20:35:50.121358 return fn()
2020-06-09 20:35:50.121607 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 303, in unique_connection
2020-06-09 20:35:50.121734 return _ConnectionFairy._checkout(self)
2020-06-09 20:35:50.121876 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 760, in _checkout
2020-06-09 20:35:50.121955 fairy = _ConnectionRecord.checkout(pool)
2020-06-09 20:35:50.122139 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 492, in checkout
2020-06-09 20:35:50.122219 rec = pool._do_get()
2020-06-09 20:35:50.122316 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/impl.py", line 139, in _do_get
2020-06-09 20:35:50.122438 self._dec_overflow()
2020-06-09 20:35:50.122649 File "/usr/lib/python3/dist-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
2020-06-09 20:35:50.122755 compat.reraise(exc_type, exc_value, exc_tb)
2020-06-09 20:35:50.122857 File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 153, in reraise
2020-06-09 20:35:50.122933 raise value
2020-06-09 20:35:50.123030 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/impl.py", line 136, in _do_get
2020-06-09 20:35:50.123106 return self._create_connection()
2020-06-09 20:35:50.123232 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 308, in _create_connection
2020-06-09 20:35:50.123347 return _ConnectionRecord(self)
2020-06-09 20:35:50.123508 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 437, in __init__
2020-06-09 20:35:50.123693 self.__connect(first_connect_check=True)
2020-06-09 20:35:50.123814 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 639, in __connect
2020-06-09 20:35:50.123891 connection = pool._invoke_creator(self)
2020-06-09 20:35:50.123991 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/strategies.py", line 114, in connect
2020-06-09 20:35:50.124067 return dialect.connect(*cargs, **cparams)
2020-06-09 20:35:50.124163 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/default.py", line 482, in connect
2020-06-09 20:35:50.124240 return self.dbapi.connect(*cargs, **cparams)
2020-06-09 20:35:50.124364 File "/usr/lib/python3/dist-packages/pymysql/__init__.py", line 94, in Connect
2020-06-09 20:35:50.124458 return Connection(*args, **kwargs)
2020-06-09 20:35:50.124611 File "/usr/lib/python3/dist-packages/pymysql/connections.py", line 253, in __init__
2020-06-09 20:35:50.124694 self.ctx = self._create_ssl_ctx(ssl)
2020-06-09 20:35:50.124792 File "/usr/lib/python3/dist-packages/pymysql/connections.py", line 330, in _create_ssl_ctx
2020-06-09 20:35:50.125073 ca = sslp.get('ca')
2020-06-09 20:35:50.125201 AttributeError: 'str' object has no attribute 'get'
2020-06-09 20:35:50.125530
2020-06-09 20:35:50.125681 During handling of the above exception, another exception occurred:
2020-06-09 20:35:50.125787
2020-06-09 20:35:50.125891 Traceback (most recent call last):
2020-06-09 20:35:50.126395 File "/usr/lib/python3/dist-packages/flask/app.py", line 2463, in __call__
2020-06-09 20:35:50.126479 return self.wsgi_app(environ, start_response)
2020-06-09 20:35:50.126547 File "/usr/lib/python3/dist-packages/werkzeug/middleware/proxy_fix.py", line 232, in __call__
2020-06-09 20:35:50.126679 return self.app(environ, start_response)
2020-06-09 20:35:50.126748 File "/usr/lib/python3/dist-packages/webob/dec.py", line 129, in __call__
2020-06-09 20:35:50.126802 resp = self.call_func(req, *args, **kw)
2020-06-09 20:35:50.126860 File "/usr/lib/python3/dist-packages/webob/dec.py", line 193, in call_func
2020-06-09 20:35:50.126912 return self.func(req, *args, **kwargs)
2020-06-09 20:35:50.126969 File "/usr/lib/python3/dist-packages/oslo_middleware/base.py", line 130, in __call__
2020-06-09 20:35:50.127021 response = req.get_response(self.application)
2020-06-09 20:35:50.127077 File "/usr/lib/python3/dist-packages/webob/request.py", line 1313, in send
2020-06-09 20:35:50.127129 status, headers, app_iter = self.call_application(
2020-06-09 20:35:50.127186 File "/usr/lib/python3/dist-packages/webob/request.py", line 1278, in call_application
2020-06-09 20:35:50.127338 app_iter = application(self.environ, start_response)
2020-06-09 20:35:50.127423 File "/usr/lib/python3/dist-packages/webob/dec.py", line 143, in __call__
2020-06-09 20:35:50.127479 return resp(environ, start_response)
2020-06-09 20:35:50.127536 File "/usr/lib/python3/dist-packages/webob/dec.py", line 129, in __call__
2020-06-09 20:35:50.127663 resp = self.call_func(req, *args, **kw)
2020-06-09 20:35:50.127736 File "/usr/lib/python3/dist-packages/webob/dec.py", line 193, in call_func
2020-06-09 20:35:50.127791 return self.func(req, *args, **kwargs)
2020-06-09 20:35:50.127848 File "/usr/lib/python3/dist-packages/oslo_middleware/base.py", line 130, in __call__
2020-06-09 20:35:50.127901 response = req.get_response(self.application)
2020-06-09 20:35:50.127957 File "/usr/lib/python3/dist-packages/webob/request.py", line 1313, in send
2020-06-09 20:35:50.128008 status, headers, app_iter = self.call_application(
2020-06-09 20:35:50.128065 File "/usr/lib/python3/dist-packages/webob/request.py", line 1278, in call_application
2020-06-09 20:35:50.128182 app_iter = application(self.environ, start_response)
2020-06-09 20:35:50.128278 File "/usr/lib/python3/dist-packages/webob/dec.py", line 129, in __call__
2020-06-09 20:35:50.128382 resp = self.call_func(req, *args, **kw)
2020-06-09 20:35:50.128482 File "/usr/lib/python3/dist-packages/webob/dec.py", line 193, in call_func
2020-06-09 20:35:50.128567 return self.func(req, *args, **kwargs)
2020-06-09 20:35:50.128730 File "/usr/lib/python3/dist-packages/osprofiler/web.py", line 112, in __call__
2020-06-09 20:35:50.128811 return request.get_response(self.application)
2020-06-09 20:35:50.128877 File "/usr/lib/python3/dist-packages/webob/request.py", line 1313, in send
2020-06-09 20:35:50.128944 status, headers, app_iter = self.call_application(
2020-06-09 20:35:50.129004 File "/usr/lib/python3/dist-packages/webob/request.py", line 1278, in call_application
2020-06-09 20:35:50.129056 app_iter = application(self.environ, start_response)
2020-06-09 20:35:50.129113 File "/usr/lib/python3/dist-packages/webob/dec.py", line 129, in __call__
2020-06-09 20:35:50.129165 resp = self.call_func(req, *args, **kw)
2020-06-09 20:35:50.129222 File "/usr/lib/python3/dist-packages/webob/dec.py", line 193, in call_func
2020-06-09 20:35:50.129273 return self.func(req, *args, **kwargs)
2020-06-09 20:35:50.129330 File "/usr/lib/python3/dist-packages/oslo_middleware/request_id.py", line 58, in __call__
2020-06-09 20:35:50.129382 response = req.get_response(self.application)
2020-06-09 20:35:50.129439 File "/usr/lib/python3/dist-packages/webob/request.py", line 1313, in send
2020-06-09 20:35:50.129499 status, headers, app_iter = self.call_application(
2020-06-09 20:35:50.129576 File "/usr/lib/python3/dist-packages/webob/request.py", line 1278, in call_application
2020-06-09 20:35:50.129688 app_iter = application(self.environ, start_response)
2020-06-09 20:35:50.129763 File "/usr/lib/python3/dist-packages/keystone/server/flask/request_processing/middleware/url_normalize.py", line 38, in __call__
2020-06-09 20:35:50.129835 return self.app(environ, start_response)
2020-06-09 20:35:50.129896 File "/usr/lib/python3/dist-packages/webob/dec.py", line 129, in __call__
2020-06-09 20:35:50.129948 resp = self.call_func(req, *args, **kw)
2020-06-09 20:35:50.130042 File "/usr/lib/python3/dist-packages/webob/dec.py", line 193, in call_func
2020-06-09 20:35:50.130101 return self.func(req, *args, **kwargs)
2020-06-09 20:35:50.130158 File "/usr/lib/python3/dist-packages/keystonemiddleware/auth_token/__init__.py", line 341, in __call__
2020-06-09 20:35:50.130210 response = req.get_response(self._app)
2020-06-09 20:35:50.130267 File "/usr/lib/python3/dist-packages/webob/request.py", line 1313, in send
2020-06-09 20:35:50.130318 status, headers, app_iter = self.call_application(
2020-06-09 20:35:50.130434 File "/usr/lib/python3/dist-packages/webob/request.py", line 1278, in call_application
2020-06-09 20:35:50.130515 app_iter = application(self.environ, start_response)
2020-06-09 20:35:50.130611 File "/usr/lib/python3/dist-packages/werkzeug/middleware/dispatcher.py", line 66, in __call__
2020-06-09 20:35:50.130800 return app(environ, start_response)
2020-06-09 20:35:50.130890 File "/usr/lib/python3/dist-packages/flask/app.py", line 2449, in wsgi_app
2020-06-09 20:35:50.130956 response = self.handle_exception(e)
2020-06-09 20:35:50.131030 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 272, in error_router
2020-06-09 20:35:50.131148 return original_handler(e)
2020-06-09 20:35:50.131256 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 272, in error_router
2020-06-09 20:35:50.131321 return original_handler(e)
2020-06-09 20:35:50.131383 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 272, in error_router
2020-06-09 20:35:50.131436 return original_handler(e)
2020-06-09 20:35:50.131493 [Previous line repeated 27 more times]
2020-06-09 20:35:50.131554 File "/usr/lib/python3/dist-packages/flask/app.py", line 1866, in handle_exception
2020-06-09 20:35:50.131606 reraise(exc_type, exc_value, tb)
2020-06-09 20:35:50.132051 File "/usr/lib/python3/dist-packages/flask/_compat.py", line 38, in reraise
2020-06-09 20:35:50.132201 raise value.with_traceback(tb)
2020-06-09 20:35:50.132317 File "/usr/lib/python3/dist-packages/flask/app.py", line 2446, in wsgi_app
2020-06-09 20:35:50.132402 response = self.full_dispatch_request()
2020-06-09 20:35:50.132498 File "/usr/lib/python3/dist-packages/flask/app.py", line 1951, in full_dispatch_request
2020-06-09 20:35:50.132574 rv = self.handle_user_exception(e)
2020-06-09 20:35:50.132689 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 272, in error_router
2020-06-09 20:35:50.132862 return original_handler(e)
2020-06-09 20:35:50.132975 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 272, in error_router
2020-06-09 20:35:50.133053 return original_handler(e)
2020-06-09 20:35:50.133149 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 272, in error_router
2020-06-09 20:35:50.133236 return original_handler(e)
2020-06-09 20:35:50.133366 [Previous line repeated 27 more times]
2020-06-09 20:35:50.133464 File "/usr/lib/python3/dist-packages/flask/app.py", line 1820, in handle_user_exception
2020-06-09 20:35:50.133541 reraise(exc_type, exc_value, tb)
2020-06-09 20:35:50.133640 File "/usr/lib/python3/dist-packages/flask/_compat.py", line 38, in reraise
2020-06-09 20:35:50.133789 raise value.with_traceback(tb)
2020-06-09 20:35:50.133903 File "/usr/lib/python3/dist-packages/flask/app.py", line 1949, in full_dispatch_request
2020-06-09 20:35:50.142432 rv = self.dispatch_request()
2020-06-09 20:35:50.143007 File "/usr/lib/python3/dist-packages/flask/app.py", line 1935, in dispatch_request
2020-06-09 20:35:50.143040 return self.view_functions[rule.endpoint](**req.view_args)
2020-06-09 20:35:50.143066 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 468, in wrapper
2020-06-09 20:35:50.143087 resp = resource(*args, **kwargs)
2020-06-09 20:35:50.143110 File "/usr/lib/python3/dist-packages/flask/views.py", line 89, in view
2020-06-09 20:35:50.143140 return self.dispatch_request(*args, **kwargs)
2020-06-09 20:35:50.143168 File "/usr/lib/python3/dist-packages/flask_restful/__init__.py", line 583, in dispatch_request
2020-06-09 20:35:50.143189 resp = meth(*args, **kwargs)
2020-06-09 20:35:50.143212 File "/usr/lib/python3/dist-packages/keystone/server/flask/common.py", line 1064, in wrapper
2020-06-09 20:35:50.143232 return f(*args, **kwargs)
2020-06-09 20:35:50.143254 File "/usr/lib/python3/dist-packages/keystone/api/auth.py", line 315, in post
2020-06-09 20:35:50.143274 token = authentication.authenticate_for_token(auth_data)
2020-06-09 20:35:50.143298 File "/usr/lib/python3/dist-packages/keystone/api/_shared/authentication.py", line 185, in authenticate_for_token
2020-06-09 20:35:50.143319 authenticate(auth_info, auth_context)
2020-06-09 20:35:50.143343 File "/usr/lib/python3/dist-packages/keystone/api/_shared/authentication.py", line 152, in authenticate
2020-06-09 20:35:50.143363 resp = method.authenticate(auth_info.get_method_data(method_name))
2020-06-09 20:35:50.143386 File "/usr/lib/python3/dist-packages/keystone/auth/plugins/password.py", line 34, in authenticate
2020-06-09 20:35:50.143407 PROVIDERS.identity_api.authenticate(
2020-06-09 20:35:50.143429 File "/usr/lib/python3/dist-packages/keystone/common/manager.py", line 115, in wrapped
2020-06-09 20:35:50.143449 __ret_val = __f(*args, **kwargs)
2020-06-09 20:35:50.143471 File "/usr/lib/python3/dist-packages/keystone/notifications.py", line 586, in wrapper
2020-06-09 20:35:50.143491 _send_audit_notification(self.action, initiator,
2020-06-09 20:35:50.143514 File "/usr/lib/python3/dist-packages/keystone/notifications.py", line 761, in _send_audit_notification
2020-06-09 20:35:50.143534 service_list = _CATALOG_HELPER_OBJ.catalog_api.list_services()
2020-06-09 20:35:50.143636 File "/usr/lib/python3/dist-packages/keystone/common/manager.py", line 115, in wrapped
2020-06-09 20:35:50.143751 __ret_val = __f(*args, **kwargs)
2020-06-09 20:35:50.143783 File "/usr/lib/python3/dist-packages/keystone/common/manager.py", line 62, in wrapper
2020-06-09 20:35:50.143804 return f(self, *args, **kwargs)
2020-06-09 20:35:50.143827 File "/usr/lib/python3/dist-packages/keystone/catalog/core.py", line 179, in list_services
2020-06-09 20:35:50.143848 return self.driver.list_services(hints or driver_hints.Hints())
2020-06-09 20:35:50.143871 File "/usr/lib/python3/dist-packages/keystone/common/driver_hints.py", line 42, in wrapper
2020-06-09 20:35:50.143891 return f(self, hints, *args, **kwargs)
2020-06-09 20:35:50.143913 File "/usr/lib/python3/dist-packages/keystone/catalog/backends/sql.py", line 183, in list_services
2020-06-09 20:35:50.143933 with sql.session_for_read() as session:
2020-06-09 20:35:50.143957 File "/usr/lib/python3.8/contextlib.py", line 113, in __enter__
2020-06-09 20:35:50.143976 return next(self.gen)
2020-06-09 20:35:50.143998 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 1058, in _transaction_scope
2020-06-09 20:35:50.144018 with current._produce_block(
2020-06-09 20:35:50.144041 File "/usr/lib/python3.8/contextlib.py", line 113, in __enter__
2020-06-09 20:35:50.144060 return next(self.gen)
2020-06-09 20:35:50.144083 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 657, in _session
2020-06-09 20:35:50.144102 self.session = self.factory._create_session(
2020-06-09 20:35:50.144125 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 418, in _create_session
2020-06-09 20:35:50.144145 self._start()
2020-06-09 20:35:50.144167 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 508, in _start
2020-06-09 20:35:50.144187 self._setup_for_connection(
2020-06-09 20:35:50.144209 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 533, in _setup_for_connection
2020-06-09 20:35:50.144228 engine = engines.create_engine(
2020-06-09 20:35:50.144251 File "/usr/lib/python3/dist-packages/debtcollector/renames.py", line 43, in decorator
2020-06-09 20:35:50.144271 return wrapped(*args, **kwargs)
2020-06-09 20:35:50.144293 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/engines.py", line 201, in create_engine
2020-06-09 20:35:50.144312 test_conn = _test_connection(engine, max_retries, retry_interval)
2020-06-09 20:35:50.144334 File "/usr/lib/python3/dist-packages/oslo_db/sqlalchemy/engines.py", line 376, in _test_connection
2020-06-09 20:35:50.144355 return engine.connect()
2020-06-09 20:35:50.144377 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 2209, in connect
2020-06-09 20:35:50.144397 return self._connection_cls(self, **kwargs)
2020-06-09 20:35:50.144419 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 103, in __init__
2020-06-09 20:35:50.144438 else engine.raw_connection()
2020-06-09 20:35:50.144461 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 2306, in raw_connection
2020-06-09 20:35:50.144480 return self._wrap_pool_connect(
2020-06-09 20:35:50.144502 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 2276, in _wrap_pool_connect
2020-06-09 20:35:50.144521 return fn()
2020-06-09 20:35:50.144543 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 303, in unique_connection
2020-06-09 20:35:50.144628 return _ConnectionFairy._checkout(self)
2020-06-09 20:35:50.144666 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 760, in _checkout
2020-06-09 20:35:50.144687 fairy = _ConnectionRecord.checkout(pool)
2020-06-09 20:35:50.144711 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 492, in checkout
2020-06-09 20:35:50.144730 rec = pool._do_get()
2020-06-09 20:35:50.144755 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/impl.py", line 139, in _do_get
2020-06-09 20:35:50.144815 self._dec_overflow()
2020-06-09 20:35:50.144845 File "/usr/lib/python3/dist-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
2020-06-09 20:35:50.144866 compat.reraise(exc_type, exc_value, exc_tb)
2020-06-09 20:35:50.144902 File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 153, in reraise
2020-06-09 20:35:50.144926 raise value
2020-06-09 20:35:50.144949 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/impl.py", line 136, in _do_get
2020-06-09 20:35:50.144969 return self._create_connection()
2020-06-09 20:35:50.144992 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 308, in _create_connection
2020-06-09 20:35:50.145011 return _ConnectionRecord(self)
2020-06-09 20:35:50.145034 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 437, in __init__
2020-06-09 20:35:50.145054 self.__connect(first_connect_check=True)
2020-06-09 20:35:50.145076 File "/usr/lib/python3/dist-packages/sqlalchemy/pool/base.py", line 639, in __connect
2020-06-09 20:35:50.145095 connection = pool._invoke_creator(self)
2020-06-09 20:35:50.145117 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/strategies.py", line 114, in connect
2020-06-09 20:35:50.145137 return dialect.connect(*cargs, **cparams)
2020-06-09 20:35:50.145159 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/default.py", line 482, in connect
2020-06-09 20:35:50.145178 return self.dbapi.connect(*cargs, **cparams)
2020-06-09 20:35:50.145201 File "/usr/lib/python3/dist-packages/pymysql/__init__.py", line 94, in Connect
2020-06-09 20:35:50.145220 return Connection(*args, **kwargs)
2020-06-09 20:35:50.145242 File "/usr/lib/python3/dist-packages/pymysql/connections.py", line 253, in __init__
2020-06-09 20:35:50.145262 self.ctx = self._create_ssl_ctx(ssl)
2020-06-09 20:35:50.145284 File "/usr/lib/python3/dist-packages/pymysql/connections.py", line 330, in _create_ssl_ctx
2020-06-09 20:35:50.145303 ca = sslp.get('ca')
2020-06-09 20:35:50.145389 AttributeError: 'str' object has no attribute 'get'

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to oslo.db (master)

Fix proposed to branch: master
Review: https://review.opendev.org/734713

Changed in oslo.db:
assignee: nobody → David Ames (thedac)
status: New → In Progress
Revision history for this message
David Ames (thedac) wrote :

As a conversation starter, here is a code example of what pymysql is expecting in order to enable SSL on the database connection:

https://review.opendev.org/734713

Revision history for this message
Corey Bryant (corey.bryant) wrote :

Thanks David, triaging for Ubuntu. Assuming this lands upstream we'll need to figure out how far back we want to SRU this.

Changed in python-oslo.db (Ubuntu):
status: New → Triaged
importance: Undecided → High
Revision history for this message
Mike Bayer (zzzeek) wrote :

hiya -

as I noted on the Gerrit, SQLAlchemy's pymysql / mysqlclient dialects support SSL and the issue is that these options are not documented. See https://github.com/sqlalchemy/sqlalchemy/issues/5397 for the documentation issue as well as how to use these parameters.

additionally I can find no background on the ssl->check_hostname parameter for any of MySQL, MariaDB, or Galera so I believe this is added in error.

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Change abandoned on oslo.db (master)

Change abandoned by David Ames (<email address hidden>) on branch: master
Review: https://review.opendev.org/734713
Reason: Unnecessary change.

Revision history for this message
David Ames (thedac) wrote :

Michael,

I have confirmed you are correct. Apologies for the trash. I swear I tested that. Closing this bug.

For completeness, the check_hostname parameter comes from pymysql [0].

[0] https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/connections.py#L336

Changed in oslo.db:
status: In Progress → Invalid
Changed in python-oslo.db (Ubuntu):
status: Triaged → Invalid
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.