Flake8: Fix and enable H405
Fix H405: H405 multi line docstring summary not separated with an empty line With this patch, flake8 passes all checks (incl. hacking checks) except the on-purpose disabled check H904. Closes-Bug: #1333290 Change-Id: If41259aefc4d6d588da5036f1f25df17b88db04f
This commit is contained in:
parent
1ee54a3144
commit
2641eb9b57
|
@ -17,8 +17,10 @@ from manila.api import extensions
|
||||||
|
|
||||||
|
|
||||||
class Extended_quotas(extensions.ExtensionDescriptor):
|
class Extended_quotas(extensions.ExtensionDescriptor):
|
||||||
"""Adds ability for admins to delete quota
|
"""Extend quotas.
|
||||||
and optionally force the update Quota command.
|
|
||||||
|
Adds ability for admins to delete quota and optionally force the
|
||||||
|
update Quota command.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
name = "ExtendedQuotas"
|
name = "ExtendedQuotas"
|
||||||
|
|
|
@ -35,6 +35,7 @@ LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
def unquote_header_value(value):
|
def unquote_header_value(value):
|
||||||
"""Unquotes a header value.
|
"""Unquotes a header value.
|
||||||
|
|
||||||
This does not use the real unquoting but what browsers are actually
|
This does not use the real unquoting but what browsers are actually
|
||||||
using for quoting.
|
using for quoting.
|
||||||
|
|
||||||
|
@ -74,7 +75,9 @@ def parse_list_header(value):
|
||||||
|
|
||||||
|
|
||||||
def parse_options_header(value):
|
def parse_options_header(value):
|
||||||
"""Parse a ``Content-Type`` like header into a tuple with the content
|
"""Parse header into content type and options.
|
||||||
|
|
||||||
|
Parse a ``Content-Type`` like header into a tuple with the content
|
||||||
type and the options:
|
type and the options:
|
||||||
|
|
||||||
>>> parse_options_header('Content-Type: text/html; mimetype=text/html')
|
>>> parse_options_header('Content-Type: text/html; mimetype=text/html')
|
||||||
|
|
|
@ -111,8 +111,9 @@ class SecurityServiceController(wsgi.Controller):
|
||||||
return self._get_security_services(req, is_detail=True)
|
return self._get_security_services(req, is_detail=True)
|
||||||
|
|
||||||
def _get_security_services(self, req, is_detail):
|
def _get_security_services(self, req, is_detail):
|
||||||
"""Returns a list of security services, transformed through view
|
"""Returns a transformed list of security services.
|
||||||
builder.
|
|
||||||
|
The list gets transformed through view builder.
|
||||||
"""
|
"""
|
||||||
context = req.environ['manila.context']
|
context = req.environ['manila.context']
|
||||||
policy.check_policy(context, RESOURCE_NAME,
|
policy.check_policy(context, RESOURCE_NAME,
|
||||||
|
|
|
@ -104,9 +104,7 @@ class ShareController(wsgi.Controller):
|
||||||
return self._get_shares(req, is_detail=True)
|
return self._get_shares(req, is_detail=True)
|
||||||
|
|
||||||
def _get_shares(self, req, is_detail):
|
def _get_shares(self, req, is_detail):
|
||||||
"""Returns a list of shares, transformed through view
|
"""Returns a list of shares, transformed through view builder."""
|
||||||
builder.
|
|
||||||
"""
|
|
||||||
context = req.environ['manila.context']
|
context = req.environ['manila.context']
|
||||||
|
|
||||||
search_opts = {}
|
search_opts = {}
|
||||||
|
|
|
@ -135,8 +135,9 @@ def _untranslate_server_summary_view(server):
|
||||||
|
|
||||||
|
|
||||||
def translate_server_exception(method):
|
def translate_server_exception(method):
|
||||||
"""Transforms the exception for the instance but keeps its traceback
|
"""Transforms the exception for the instance.
|
||||||
intact.
|
|
||||||
|
Note: keeps its traceback intact.
|
||||||
"""
|
"""
|
||||||
def wrapper(self, ctx, instance_id, *args, **kwargs):
|
def wrapper(self, ctx, instance_id, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -62,7 +62,8 @@ def downgrade(revision):
|
||||||
|
|
||||||
def stamp(revision):
|
def stamp(revision):
|
||||||
"""Stamp database with provided revision.
|
"""Stamp database with provided revision.
|
||||||
Dont run any migrations.
|
|
||||||
|
Don't run any migrations.
|
||||||
|
|
||||||
:param revision: Should match one from repository or head - to stamp
|
:param revision: Should match one from repository or head - to stamp
|
||||||
database with most recent revision
|
database with most recent revision
|
||||||
|
|
|
@ -65,8 +65,7 @@ class Scheduler(object):
|
||||||
return self.host_manager.get_host_list()
|
return self.host_manager.get_host_list()
|
||||||
|
|
||||||
def get_service_capabilities(self):
|
def get_service_capabilities(self):
|
||||||
"""Get the normalized set of capabilities for the services.
|
"""Get the normalized set of capabilities for the services."""
|
||||||
"""
|
|
||||||
return self.host_manager.get_service_capabilities()
|
return self.host_manager.get_service_capabilities()
|
||||||
|
|
||||||
def update_service_capabilities(self, service_name, host, capabilities):
|
def update_service_capabilities(self, service_name, host, capabilities):
|
||||||
|
|
|
@ -40,9 +40,7 @@ class FilterScheduler(driver.Scheduler):
|
||||||
self.max_attempts = self._max_attempts()
|
self.max_attempts = self._max_attempts()
|
||||||
|
|
||||||
def schedule(self, context, topic, method, *args, **kwargs):
|
def schedule(self, context, topic, method, *args, **kwargs):
|
||||||
"""The schedule() contract requires we return the one
|
"""Return best-suited host for request."""
|
||||||
best-suited host for this request.
|
|
||||||
"""
|
|
||||||
self._schedule(context, topic, *args, **kwargs)
|
self._schedule(context, topic, *args, **kwargs)
|
||||||
|
|
||||||
def _get_configuration_options(self):
|
def _get_configuration_options(self):
|
||||||
|
@ -51,16 +49,19 @@ class FilterScheduler(driver.Scheduler):
|
||||||
|
|
||||||
def _post_select_populate_filter_properties(self, filter_properties,
|
def _post_select_populate_filter_properties(self, filter_properties,
|
||||||
host_state):
|
host_state):
|
||||||
"""Add additional information to the filter properties after a host has
|
"""Add additional information to filter properties.
|
||||||
|
|
||||||
|
Add additional information to the filter properties after a host has
|
||||||
been selected by the scheduling process.
|
been selected by the scheduling process.
|
||||||
"""
|
"""
|
||||||
# Add a retry entry for the selected volume backend:
|
# Add a retry entry for the selected volume backend:
|
||||||
self._add_retry_host(filter_properties, host_state.host)
|
self._add_retry_host(filter_properties, host_state.host)
|
||||||
|
|
||||||
def _add_retry_host(self, filter_properties, host):
|
def _add_retry_host(self, filter_properties, host):
|
||||||
"""Add a retry entry for the selected volume backend. In the event that
|
"""Add retry entry for the selected volume backend.
|
||||||
the request gets re-scheduled, this entry will signal that the given
|
|
||||||
backend has already been tried.
|
In the event that the request gets re-scheduled, this entry
|
||||||
|
will signal that the given backend has already been tried.
|
||||||
"""
|
"""
|
||||||
retry = filter_properties.get('retry', None)
|
retry = filter_properties.get('retry', None)
|
||||||
if not retry:
|
if not retry:
|
||||||
|
@ -101,8 +102,9 @@ class FilterScheduler(driver.Scheduler):
|
||||||
snapshot_id=snapshot_id)
|
snapshot_id=snapshot_id)
|
||||||
|
|
||||||
def _schedule_share(self, context, request_spec, filter_properties=None):
|
def _schedule_share(self, context, request_spec, filter_properties=None):
|
||||||
"""Returns a list of hosts that meet the required specs,
|
"""Returns a list of hosts that meet the required specs.
|
||||||
ordered by their fitness.
|
|
||||||
|
The list is ordered by their fitness.
|
||||||
"""
|
"""
|
||||||
elevated = context.elevated()
|
elevated = context.elevated()
|
||||||
|
|
||||||
|
@ -157,7 +159,9 @@ class FilterScheduler(driver.Scheduler):
|
||||||
return best_host
|
return best_host
|
||||||
|
|
||||||
def _populate_retry_share(self, filter_properties, properties):
|
def _populate_retry_share(self, filter_properties, properties):
|
||||||
"""Populate filter properties with history of retries for this
|
"""Populate filter properties with retry history.
|
||||||
|
|
||||||
|
Populate filter properties with history of retries for this
|
||||||
request. If maximum retries is exceeded, raise NoValidHost.
|
request. If maximum retries is exceeded, raise NoValidHost.
|
||||||
"""
|
"""
|
||||||
max_attempts = self.max_attempts
|
max_attempts = self.max_attempts
|
||||||
|
@ -189,7 +193,9 @@ class FilterScheduler(driver.Scheduler):
|
||||||
raise exception.NoValidHost(reason=msg)
|
raise exception.NoValidHost(reason=msg)
|
||||||
|
|
||||||
def _log_share_error(self, share_id, retry):
|
def _log_share_error(self, share_id, retry):
|
||||||
"""If the request contained an exception from a previous share
|
"""Log any exceptions from a previous share create operation.
|
||||||
|
|
||||||
|
If the request contained an exception from a previous share
|
||||||
create operation, log it to aid debugging.
|
create operation, log it to aid debugging.
|
||||||
"""
|
"""
|
||||||
exc = retry.pop('exc', None) # string-ified exception from share
|
exc = retry.pop('exc', None) # string-ified exception from share
|
||||||
|
@ -211,8 +217,9 @@ class FilterScheduler(driver.Scheduler):
|
||||||
|
|
||||||
def populate_filter_properties_share(self, request_spec,
|
def populate_filter_properties_share(self, request_spec,
|
||||||
filter_properties):
|
filter_properties):
|
||||||
"""Stuff things into filter_properties. Can be overridden in a
|
"""Stuff things into filter_properties.
|
||||||
subclass to add more data.
|
|
||||||
|
Can be overridden in a subclass to add more data.
|
||||||
"""
|
"""
|
||||||
shr = request_spec['share_properties']
|
shr = request_spec['share_properties']
|
||||||
filter_properties['size'] = shr['size']
|
filter_properties['size'] = shr['size']
|
||||||
|
|
|
@ -20,9 +20,7 @@ LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class RetryFilter(filters.BaseHostFilter):
|
class RetryFilter(filters.BaseHostFilter):
|
||||||
"""Filter out nodes that have already been attempted for scheduling
|
"""Filter out already tried nodes for scheduling purposes."""
|
||||||
purposes
|
|
||||||
"""
|
|
||||||
|
|
||||||
def host_passes(self, host_state, filter_properties):
|
def host_passes(self, host_state, filter_properties):
|
||||||
"""Skip nodes that have already been attempted."""
|
"""Skip nodes that have already been attempted."""
|
||||||
|
|
|
@ -162,10 +162,12 @@ class HostManager(object):
|
||||||
self.weight_classes = self.weight_handler.get_all_classes()
|
self.weight_classes = self.weight_handler.get_all_classes()
|
||||||
|
|
||||||
def _choose_host_filters(self, filter_cls_names):
|
def _choose_host_filters(self, filter_cls_names):
|
||||||
"""Since the caller may specify which filters to use we need
|
"""Choose acceptable filters.
|
||||||
to have an authoritative list of what is permissible. This
|
|
||||||
function checks the filter names against a predefined set
|
Since the caller may specify which filters to use we need to
|
||||||
of acceptable filters.
|
have an authoritative list of what is permissible. This
|
||||||
|
function checks the filter names against a predefined set of
|
||||||
|
acceptable filters.
|
||||||
"""
|
"""
|
||||||
if filter_cls_names is None:
|
if filter_cls_names is None:
|
||||||
filter_cls_names = CONF.scheduler_default_filters
|
filter_cls_names = CONF.scheduler_default_filters
|
||||||
|
@ -188,10 +190,12 @@ class HostManager(object):
|
||||||
return good_filters
|
return good_filters
|
||||||
|
|
||||||
def _choose_host_weighers(self, weight_cls_names):
|
def _choose_host_weighers(self, weight_cls_names):
|
||||||
"""Since the caller may specify which weighers to use, we need
|
"""Choose acceptable weighers.
|
||||||
to have an authoritative list of what is permissible. This
|
|
||||||
function checks the weigher names against a predefined set
|
Since the caller may specify which weighers to use, we need to
|
||||||
of acceptable weighers.
|
have an authoritative list of what is permissible. This
|
||||||
|
function checks the weigher names against a predefined set of
|
||||||
|
acceptable weighers.
|
||||||
"""
|
"""
|
||||||
if weight_cls_names is None:
|
if weight_cls_names is None:
|
||||||
weight_cls_names = CONF.scheduler_default_weighers
|
weight_cls_names = CONF.scheduler_default_weighers
|
||||||
|
@ -246,11 +250,13 @@ class HostManager(object):
|
||||||
self.service_states[host] = capab_copy
|
self.service_states[host] = capab_copy
|
||||||
|
|
||||||
def get_all_host_states_share(self, context):
|
def get_all_host_states_share(self, context):
|
||||||
"""Returns a dict of all the hosts the HostManager
|
"""Get all hosts and their states.
|
||||||
knows about. Also, each of the consumable resources in HostState
|
|
||||||
are pre-populated and adjusted based on data in the db.
|
|
||||||
|
|
||||||
For example:
|
Returns a dict of all the hosts the HostManager knows
|
||||||
|
about. Also, each of the consumable resources in HostState are
|
||||||
|
pre-populated and adjusted based on data in the db.
|
||||||
|
|
||||||
|
For example:
|
||||||
{'192.168.1.100': HostState(), ...}
|
{'192.168.1.100': HostState(), ...}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,10 @@ LOG = logging.getLogger(__name__)
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
|
|
||||||
def __init__(self, share_opts, config_group=None):
|
def __init__(self, share_opts, config_group=None):
|
||||||
"""This takes care of grafting the implementation's config
|
"""Graft config values into config group.
|
||||||
values into the config group.
|
|
||||||
|
This takes care of grafting the implementation's config values
|
||||||
|
into the config group.
|
||||||
"""
|
"""
|
||||||
self.config_group = config_group
|
self.config_group = config_group
|
||||||
|
|
||||||
|
|
|
@ -559,9 +559,12 @@ class WsgiLimiterTest(BaseLimitTestSuite):
|
||||||
return jsonutils.dumps({"verb": verb, "path": path})
|
return jsonutils.dumps({"verb": verb, "path": path})
|
||||||
|
|
||||||
def _request(self, verb, url, username=None):
|
def _request(self, verb, url, username=None):
|
||||||
"""Make sure that POSTing to the given url causes the given username
|
"""Send request.
|
||||||
to perform the given action. Make the internal rate limiter return
|
|
||||||
delay and make sure that the WSGI app returns the correct response.
|
Make sure that POSTing to the given url causes the given
|
||||||
|
username to perform the given action. Make the internal rate
|
||||||
|
limiter return delay and make sure that the WSGI app returns
|
||||||
|
the correct response.
|
||||||
"""
|
"""
|
||||||
if username:
|
if username:
|
||||||
request = webob.Request.blank("/%s" % username)
|
request = webob.Request.blank("/%s" % username)
|
||||||
|
@ -662,8 +665,10 @@ class FakeHttplibConnection(object):
|
||||||
|
|
||||||
|
|
||||||
def wire_HTTPConnection_to_WSGI(host, app):
|
def wire_HTTPConnection_to_WSGI(host, app):
|
||||||
"""Monkeypatches HTTPConnection so that if you try to connect to host, you
|
"""Wire HTTPConnection to WSGI app.
|
||||||
are instead routed straight to the given WSGI app.
|
|
||||||
|
Monkeypatches HTTPConnection so that if you try to connect to
|
||||||
|
host, you are instead routed straight to the given WSGI app.
|
||||||
|
|
||||||
After calling this method, when any code calls
|
After calling this method, when any code calls
|
||||||
|
|
||||||
|
|
|
@ -546,7 +546,9 @@ def is_valid_boolstr(val):
|
||||||
|
|
||||||
|
|
||||||
def is_valid_ipv4(address):
|
def is_valid_ipv4(address):
|
||||||
"""valid the address strictly as per format xxx.xxx.xxx.xxx.
|
"""Validate IPv4 address.
|
||||||
|
|
||||||
|
Valid the address strictly as per format xxx.xxx.xxx.xxx.
|
||||||
where xxx is a value between 0 and 255.
|
where xxx is a value between 0 and 255.
|
||||||
"""
|
"""
|
||||||
parts = address.split(".")
|
parts = address.split(".")
|
||||||
|
@ -601,7 +603,9 @@ def is_eventlet_bug105():
|
||||||
|
|
||||||
|
|
||||||
def monkey_patch():
|
def monkey_patch():
|
||||||
"""If the Flags.monkey_patch set as True,
|
"""Patch decorator.
|
||||||
|
|
||||||
|
If the Flags.monkey_patch set as True,
|
||||||
this function patches a decorator
|
this function patches a decorator
|
||||||
for all functions in specified modules.
|
for all functions in specified modules.
|
||||||
You can set decorators for each modules
|
You can set decorators for each modules
|
||||||
|
@ -711,7 +715,9 @@ def hash_file(file_like_object):
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def temporary_mutation(obj, **kwargs):
|
def temporary_mutation(obj, **kwargs):
|
||||||
"""Temporarily set the attr on a particular object to a given value then
|
"""Temporarily set the attr on a particular object.
|
||||||
|
|
||||||
|
Temporarily set the attr on a particular object to a given value then
|
||||||
revert when finished.
|
revert when finished.
|
||||||
|
|
||||||
One use of this is to temporarily set the read_deleted flag on a context
|
One use of this is to temporarily set the read_deleted flag on a context
|
||||||
|
@ -835,8 +841,9 @@ def walk_class_hierarchy(clazz, encountered=None):
|
||||||
|
|
||||||
|
|
||||||
class UndoManager(object):
|
class UndoManager(object):
|
||||||
"""Provides a mechanism to facilitate rolling back a series of actions
|
"""Provides a mechanism to facilitate rolling back a series of actions.
|
||||||
when an exception is raised.
|
|
||||||
|
This can be used when an exception is raised.
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.undo_stack = []
|
self.undo_stack = []
|
||||||
|
|
|
@ -172,8 +172,7 @@ def _untranslate_snapshot_summary_view(context, snapshot):
|
||||||
|
|
||||||
|
|
||||||
def translate_volume_exception(method):
|
def translate_volume_exception(method):
|
||||||
"""Transforms the exception for the volume but keeps its traceback intact.
|
"""Transforms the exception for the volume, keeps its traceback intact."""
|
||||||
"""
|
|
||||||
def wrapper(self, ctx, volume_id, *args, **kwargs):
|
def wrapper(self, ctx, volume_id, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
res = method(self, ctx, volume_id, *args, **kwargs)
|
res = method(self, ctx, volume_id, *args, **kwargs)
|
||||||
|
@ -189,8 +188,9 @@ def translate_volume_exception(method):
|
||||||
|
|
||||||
|
|
||||||
def translate_snapshot_exception(method):
|
def translate_snapshot_exception(method):
|
||||||
"""Transforms the exception for the snapshot but keeps its traceback
|
"""Transforms the exception for the snapshot.
|
||||||
intact.
|
|
||||||
|
Note: Keeps its traceback intact.
|
||||||
"""
|
"""
|
||||||
def wrapper(self, ctx, snapshot_id, *args, **kwargs):
|
def wrapper(self, ctx, snapshot_id, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
|
|
5
tox.ini
5
tox.ini
|
@ -42,13 +42,10 @@ deps = -r{toxinidir}/requirements.txt
|
||||||
commands = bash tools/lintstack.sh
|
commands = bash tools/lintstack.sh
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
# TODO: These are not intentionally disabled, reenable when fixed:
|
|
||||||
# H405: multi line docstring summary not separated with an empty line
|
|
||||||
#
|
|
||||||
# Following checks are ignored on purpose:
|
# Following checks are ignored on purpose:
|
||||||
#
|
#
|
||||||
# H904 wrap long lines in parentheses instead of a backslash
|
# H904 wrap long lines in parentheses instead of a backslash
|
||||||
# reason: removed in hacking (https://review.openstack.org/#/c/101701/)
|
# reason: removed in hacking (https://review.openstack.org/#/c/101701/)
|
||||||
ignore = H405,H904
|
ignore = H904
|
||||||
builtins = _
|
builtins = _
|
||||||
exclude = .venv,.tox,dist,doc,openstack,*egg
|
exclude = .venv,.tox,dist,doc,openstack,*egg
|
||||||
|
|
Loading…
Reference in New Issue