summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Pekelny <ipekelny@mirantis.com>2014-05-13 15:12:37 +0300
committerIlya Pekelny <ipekelny@mirantis.com>2014-05-30 13:00:09 +0300
commitc260bea9cfbe4b7a308c195e653fb4b3b1006858 (patch)
tree5da997aa9242409d36ecdebe4ef15bbde3852b68
parentfb889453b73be8ba2be9362e53234c42bb4330c0 (diff)
downloadoslo-db-c260bea9cfbe4b7a308c195e653fb4b3b1006858.tar.gz
Log a cause of db backend connection failure
If opportunistic test case, i.e. fixture, can't connect to a test database, it is happening silently, without any logs. Most of times we need to know a cause of failure. Change-Id: Ia9f93a2ed38d11ec22d7aaafc90e194b153c5393 Closes-Bug: #1306017
-rw-r--r--oslo/db/sqlalchemy/utils.py3
-rw-r--r--tests/sqlalchemy/test_utils.py13
2 files changed, 13 insertions, 3 deletions
diff --git a/oslo/db/sqlalchemy/utils.py b/oslo/db/sqlalchemy/utils.py
index fc9f64c..a2751fb 100644
--- a/oslo/db/sqlalchemy/utils.py
+++ b/oslo/db/sqlalchemy/utils.py
@@ -631,9 +631,10 @@ def is_backend_avail(backend, database, user=None, passwd=None):
passwd=passwd)
engine = sqlalchemy.create_engine(connect_uri)
connection = engine.connect()
- except Exception:
+ except Exception as e:
# intentionally catch all to handle exceptions even if we don't
# have any backend code loaded.
+ LOG.info(_LI("The %s backend is unavailable: %s"), backend, e)
return False
else:
connection.close()
diff --git a/tests/sqlalchemy/test_utils.py b/tests/sqlalchemy/test_utils.py
index d1b82d8..4493978 100644
--- a/tests/sqlalchemy/test_utils.py
+++ b/tests/sqlalchemy/test_utils.py
@@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import fixtures
import uuid
import warnings
@@ -27,7 +28,7 @@ from sqlalchemy.dialects import mysql
from sqlalchemy import Boolean, Index, Integer, DateTime, String
from sqlalchemy import MetaData, Table, Column, ForeignKey
from sqlalchemy.engine import reflection
-from sqlalchemy.exc import SAWarning, OperationalError
+from sqlalchemy.exc import SAWarning, ResourceClosedError
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import select
from sqlalchemy.types import UserDefinedType, NullType
@@ -649,11 +650,19 @@ class TestConnectionUtils(test_utils.BaseTestCase):
self.assertTrue(utils.is_backend_avail(**self.full_credentials))
def test_is_backend_unavail(self):
+ log = self.useFixture(fixtures.FakeLogger())
+ error_cause = ('This result object does not return rows. It has been'
+ 'closed automatically.')
+ error_msg = ("The %s backend is unavailable: %s\n" %
+ ('mysql', error_cause))
+
self.mox.StubOutWithMock(sqlalchemy.engine.base.Engine, 'connect')
- sqlalchemy.engine.base.Engine.connect().AndRaise(OperationalError)
+ sqlalchemy.engine.base.Engine.connect().AndRaise(
+ ResourceClosedError(error_cause))
self.mox.ReplayAll()
self.assertFalse(utils.is_backend_avail(**self.full_credentials))
+ self.assertEqual(error_msg, log.output)
def test_get_db_connection_info(self):
conn_pieces = parse.urlparse(self.connect_string)