Change message of log_deprecated decorator

It is unclear what is deprecated in current message.

For example, methods `wait_for`, `wait_is_ready` and `wait_for_delete` were
deprecated in https://review.openstack.org/#/c/232438 . Deprecation
messages are equal, so logs are equal too:

    Deprecated, use wait_for_status instead. (deprecated in Rally v0.1.2)

This patch adds deprecated method's name, so it is easier to determine what
method produces deprecation log message.

Also, this patch adds ability to print warning message once, which can be
helpful for deprecated methods used in scenarios.

Change-Id: Id86e984986ecb61e7b92cc61882382179fc8a74b
This commit is contained in:
Andrey Kurilin 2015-10-09 14:37:27 +03:00
parent 4b3fa606e2
commit 2644c666c6
3 changed files with 15 additions and 11 deletions

View File

@ -178,22 +178,26 @@ def log_verification_wrapper(log_function, msg, **kw):
return _log_wrapper("verification", log_function, msg, **kw)
def log_deprecated(message, rally_version, log_function=None):
def log_deprecated(message, rally_version, log_function=None, once=False):
"""A wrapper marking a certain method as deprecated.
:param message: Message that describes why the method was deprecated
:param rally_version: version of Rally when the method was deprecated
:param log_function: Logging method to be used, e.g. LOG.info
:param once: Show only once (default is each)
"""
log_function = log_function or LOG.warning
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
log_function("%(msg)s (deprecated in Rally v%(version)s)" %
{"msg": message, "version": rally_version})
result = f(*args, **kwargs)
return result
if (not once) or (not getattr(f, "_warned_dep_method", False)):
log_function("'%(func)s' is deprecated in Rally v%(version)s: "
"%(msg)s" % {"msg": message,
"version": rally_version,
"func": f.__name__})
setattr(f, "_warned_dep_method", once)
return f(*args, **kwargs)
return wrapper
return decorator

View File

@ -101,7 +101,7 @@ def manager_list_size(sizes):
return _list
@utils.log_deprecated("Deprecated, use wait_for_status instead.", "0.1.2")
@utils.log_deprecated("Use wait_for_status instead.", "0.1.2", once=True)
def wait_for(resource, is_ready=None, ready_statuses=None,
failure_statuses=None, status_attr="status", update_resource=None,
timeout=60, check_interval=1):
@ -148,7 +148,7 @@ def wait_for(resource, is_ready=None, ready_statuses=None,
check_interval=check_interval)
@utils.log_deprecated("Deprecated, use wait_for_status instead.", "0.1.2")
@utils.log_deprecated("Use wait_for_status instead.", "0.1.2", once=True)
def wait_is_ready(resource, is_ready, update_resource=None,
timeout=60, check_interval=1):
@ -247,7 +247,7 @@ def wait_for_status(resource, ready_statuses, failure_statuses=None,
resource_status=get_status(resource))
@utils.log_deprecated("Deprecated, use wait_for_status instead.", "0.1.2")
@utils.log_deprecated("Use wait_for_status instead.", "0.1.2", once=True)
def wait_for_delete(resource, update_resource=None, timeout=60,
check_interval=1):
"""Wait for the full deletion of resource.

View File

@ -144,13 +144,13 @@ class LogTestCase(test.TestCase):
def test_log_deprecated(self):
mock_log = mock.MagicMock()
@utils.log_deprecated("Deprecated test", "0.0.1", mock_log)
@utils.log_deprecated("some alternative", "0.0.1", mock_log)
def some_method(x, y):
return x + y
self.assertEqual(some_method(2, 2), 4)
mock_log.assert_called_once_with("Deprecated test "
"(deprecated in Rally v0.0.1)")
mock_log.assert_called_once_with("'some_method' is deprecated in "
"Rally v0.0.1: some alternative")
def test_log_deprecated_args(self):
mock_log = mock.MagicMock()