The cinder.hacking.checks Module

class BaseASTChecker(tree, filename)

Bases: ast.NodeVisitor

Provides a simple framework for writing AST-based checks.

Subclasses should implement visit_* methods like any other AST visitor implementation. When they detect an error for a particular node the method should call self.add_error(offending_node). Details about where in the code the error occurred will be pulled from the node object.

Subclasses should also provide a class variable named CHECK_DESC to be used for the human readable error message.

add_error(node, message=None)

Add an error caused by a node to the list of errors for pep8.

run()

Called automatically by pep8.

class CheckForStrUnicodeExc(tree, filename)

Bases: cinder.hacking.checks.BaseASTChecker

Checks for the use of str() or unicode() on an exception.

This currently only handles the case where str() or unicode() is used in the scope of an exception handler. If the exception is passed into a function, returned from an assertRaises, or used on an exception created in the same scope, this does not catch it.

CHECK_DESC = 'N325 str() and unicode() cannot be used on an exception. Remove or use six.text_type()'
visit_Call(node)
visit_ExceptHandler(node)
visit_TryExcept(node)
class CheckLoggingFormatArgs(tree, filename)

Bases: cinder.hacking.checks.BaseASTChecker

Check for improper use of logging format arguments.

LOG.debug(“Volume %s caught fire and is at %d degrees C and climbing.”,
(‘volume1’, 500))

The format arguments should not be a tuple as it is easy to miss.

CHECK_DESC = 'C310 Log method arguments should not be a tuple.'
LOG_METHODS = ['debug', 'info', 'warn', 'warning', 'error', 'exception', 'critical', 'fatal', 'trace', 'log']
visit_Call(node)

Look for the ‘LOG.*’ calls.

class CheckOptRegistrationArgs(tree, filename)

Bases: cinder.hacking.checks.BaseASTChecker

Verifying the registration of options are well formed

This class creates a check for single opt or list/tuple of opts when register_opt() or register_opts() are being called.

CHECK_DESC = 'C311: Arguments being passed to register_opt/register_opts must be a single option or list/tuple of options respectively. Options must also end with _opt or _opts respectively.'
plural_method = 'register_opts'
register_methods = ['register_opt', 'register_opts']
singular_method = 'register_opt'
visit_Call(node)

Look for the register_opt/register_opts calls.

check_datetime_now(logical_line, noqa)
check_explicit_underscore_import(logical_line, filename)

Check for explicit import of the _ function

We need to ensure that any files that are using the _() function to translate logs are explicitly importing the _ function. We can’t trust unit test to catch whether the import has been added so we need to check for it here.

check_no_log_audit(logical_line)

Ensure that we are not using LOG.audit messages

Plans are in place going forward as discussed in the following spec (https://review.openstack.org/#/c/91446/) to take out LOG.audit messages. Given that audit was a concept invented for OpenStack we can enforce not using it.

check_no_print_statements(logical_line, filename, noqa)
check_timeutils_isotime(logical_line)
check_timeutils_strtime(logical_line)
check_unicode_usage(logical_line, noqa)
dict_constructor_with_list_copy(logical_line)
factory(register)
no_log_warn(logical_line)
no_mutable_default_args(logical_line)
no_test_log(logical_line, filename, noqa)
no_translate_debug_logs(logical_line, filename)

Check for ‘LOG.debug(_(‘

As per our translation policy, https://wiki.openstack.org/wiki/LoggingStandards#Log_Translation we shouldn’t translate debug level logs.

  • This check assumes that ‘LOG’ is a logger.
  • Use filename so we can start enforcing this in specific folders instead of needing to do so all at once.

N319

no_vi_headers(physical_line, line_number, lines)

Check for vi editor configuration in source files.

By default vi modelines can only appear in the first or last 5 lines of a source file.

N314

validate_assertIsNone(logical_line)
validate_assertTrue(logical_line)
validate_log_translations(logical_line, filename)