Move warnings to their own module

Raising warnings from an exception module can result in a rather
confusing message:

  Running command: '/usr/bin/nova-scheduler '
  /.../sqlalchemy/enginefacade.py:332: NotSupportedWarning: Configuration option(s) ['use_tpool'] not supported
    exception.NotSupportedWarning

For someone not used to Python's 'warning' infrastructure, this can look
worse than it is, as seen at [1].

While this particular warning was resolved in change I4a5f8958c3e, it's
possible that a similar warning could be raised for other options. Best
to move this out of the 'exception' module and into something more
sensible.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1639423

Change-Id: I8e0480fb11123067a111ed6aeda6b47614615645
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane 2018-10-17 13:59:36 +01:00
parent baa0a045b5
commit 1f0f5654a7
4 changed files with 55 additions and 28 deletions

View File

@ -43,10 +43,12 @@ with `try/except` statement. This is required for consistent handling of
database errors. database errors.
""" """
from debtcollector import moves
from oslo_utils.excutils import CausedByException
import six import six
from oslo_db._i18n import _ from oslo_db._i18n import _
from oslo_utils.excutils import CausedByException from oslo_db import warning
class DBError(CausedByException): class DBError(CausedByException):
@ -299,27 +301,10 @@ class CantStartEngineError(Exception):
"""Error raised when the enginefacade cannot start up correctly.""" """Error raised when the enginefacade cannot start up correctly."""
class NotSupportedWarning(Warning): moves.moved_class(warning.NotSupportedWarning,
"""Warn that an argument or call that was passed is not supported. 'NotSupportedWarning',
__name__, version='Stein')
This subclasses Warning so that it can be filtered as a distinct moves.moved_class(warning.OsloDBDeprecationWarning,
category. 'OsloDBDeprecationWarning',
__name__, version='Stein')
.. seealso::
https://docs.python.org/2/library/warnings.html
"""
class OsloDBDeprecationWarning(DeprecationWarning):
"""Issued per usage of a deprecated API.
This subclasses DeprecationWarning so that it can be filtered as a distinct
category.
.. seealso::
https://docs.python.org/2/library/warnings.html
"""

View File

@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import contextlib import contextlib
import functools import functools
import operator import operator
@ -28,6 +27,7 @@ from oslo_db import options
from oslo_db.sqlalchemy import engines from oslo_db.sqlalchemy import engines
from oslo_db.sqlalchemy import orm from oslo_db.sqlalchemy import orm
from oslo_db.sqlalchemy import utils from oslo_db.sqlalchemy import utils
from oslo_db import warning
class _symbol(object): class _symbol(object):
@ -334,7 +334,7 @@ class _TransactionFactory(object):
warnings.warn( warnings.warn(
"Configuration option(s) %r not supported" % "Configuration option(s) %r not supported" %
sorted(not_supported), sorted(not_supported),
exception.NotSupportedWarning warning.NotSupportedWarning
) )
def get_legacy_facade(self): def get_legacy_facade(self):
@ -1253,7 +1253,7 @@ class LegacyEngineFacade(object):
warnings.warn( warnings.warn(
"EngineFacade is deprecated; please use " "EngineFacade is deprecated; please use "
"oslo_db.sqlalchemy.enginefacade", "oslo_db.sqlalchemy.enginefacade",
exception.OsloDBDeprecationWarning, warning.OsloDBDeprecationWarning,
stacklevel=2) stacklevel=2)
if _factory: if _factory:
self._factory = _factory self._factory = _factory

View File

@ -37,6 +37,7 @@ from oslo_db.sqlalchemy import enginefacade
from oslo_db.sqlalchemy import engines as oslo_engines from oslo_db.sqlalchemy import engines as oslo_engines
from oslo_db.sqlalchemy import orm from oslo_db.sqlalchemy import orm
from oslo_db.tests.sqlalchemy import base as test_base from oslo_db.tests.sqlalchemy import base as test_base
from oslo_db import warning
enginefacade.transaction_context_provider(oslo_context.RequestContext) enginefacade.transaction_context_provider(oslo_context.RequestContext)
@ -2182,7 +2183,7 @@ class ConfigOptionsTest(oslo_test_base.BaseTestCase):
self.assertEqual(1, len(w)) self.assertEqual(1, len(w))
self.assertTrue( self.assertTrue(
issubclass(w[-1].category, exception.NotSupportedWarning)) issubclass(w[-1].category, warning.NotSupportedWarning))
self.assertEqual( self.assertEqual(
"Configuration option(s) ['fake1', 'wrong2'] not supported", "Configuration option(s) ['fake1', 'wrong2'] not supported",
str(w[-1].message) str(w[-1].message)

41
oslo_db/warning.py Normal file
View File

@ -0,0 +1,41 @@
# Copyright 2018 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Custom warnings."""
class NotSupportedWarning(Warning):
"""Warn that an argument or call that was passed is not supported.
This subclasses Warning so that it can be filtered as a distinct
category.
.. seealso::
https://docs.python.org/2/library/warnings.html
"""
class OsloDBDeprecationWarning(DeprecationWarning):
"""Issued per usage of a deprecated API.
This subclasses DeprecationWarning so that it can be filtered as a distinct
category.
.. seealso::
https://docs.python.org/2/library/warnings.html
"""