Flake8: Fix and enable H404
Fix and enable flake8 test H404: H404 multi line docstring should start without a leading new line Change-Id: I13dc13bb5e81d65300680df094cde538c7a6f6df Partial-Bug: #1333290
This commit is contained in:
parent
4a49b5e562
commit
8203c51081
@ -95,6 +95,7 @@ def args(*args, **kwargs):
|
||||
|
||||
def param2id(object_id):
|
||||
"""Helper function to convert various id types to internal id.
|
||||
|
||||
args: [object_id], e.g. 'vol-0000000a' or 'volume-0000000a' or '10'
|
||||
"""
|
||||
if uuidutils.is_uuid_like(object_id):
|
||||
@ -169,6 +170,7 @@ class ShellCommands(object):
|
||||
@args('--path', required=True, help='Script path')
|
||||
def script(self, path):
|
||||
"""Runs the script from the specifed path with flags set properly.
|
||||
|
||||
arguments: path
|
||||
"""
|
||||
exec(compile(open(path).read(), path, 'exec'), locals(), globals())
|
||||
@ -189,6 +191,7 @@ class HostCommands(object):
|
||||
help='Availability Zone (default: %(default)s)')
|
||||
def list(self, zone=None):
|
||||
"""Show a list of all physical hosts. Filter by zone.
|
||||
|
||||
args: [zone]
|
||||
"""
|
||||
print("%-25s\t%-15s" % (_('host'), _('zone')))
|
||||
@ -354,8 +357,9 @@ CATEGORIES = {
|
||||
|
||||
|
||||
def methods_of(obj):
|
||||
"""Get all callable methods of an object that don't start with underscore
|
||||
returns a list of tuples of the form (method_name, method)
|
||||
"""Get all callable methods of an object that don't start with underscore.
|
||||
|
||||
Returns a list of tuples of the form (method_name, method).
|
||||
"""
|
||||
result = []
|
||||
for i in dir(obj):
|
||||
|
@ -358,8 +358,8 @@ class SharesClient(rest_client.RestClient):
|
||||
return resp, self._parse_resp(body)
|
||||
|
||||
def reset_state(self, s_id, status="error", s_type="shares"):
|
||||
"""
|
||||
Resets the state of a share or a snapshot
|
||||
"""Resets the state of a share or a snapshot.
|
||||
|
||||
status: available, error, creating, deleting, error_deleting
|
||||
s_type: shares, snapshots
|
||||
"""
|
||||
@ -368,8 +368,8 @@ class SharesClient(rest_client.RestClient):
|
||||
return self.post("%s/%s/action" % (s_type, s_id), body)
|
||||
|
||||
def force_delete(self, s_id, s_type="shares"):
|
||||
"""
|
||||
Force delete share or snapshot
|
||||
"""Force delete share or snapshot.
|
||||
|
||||
s_type: shares, snapshots
|
||||
"""
|
||||
body = {"os-force_delete": None}
|
||||
|
@ -39,7 +39,8 @@ LOG = logging.getLogger(__name__)
|
||||
class LimitingReader(object):
|
||||
"""Reader to limit the size of an incoming request."""
|
||||
def __init__(self, data, limit):
|
||||
"""
|
||||
"""Initialize LimitingReader.
|
||||
|
||||
:param data: Underlying data object
|
||||
:param limit: maximum number of bytes the reader should allow
|
||||
"""
|
||||
|
@ -74,15 +74,11 @@ class LimitsTemplate(xmlutil.TemplateBuilder):
|
||||
|
||||
|
||||
class LimitsController(object):
|
||||
"""
|
||||
Controller for accessing limits in the OpenStack API.
|
||||
"""
|
||||
"""Controller for accessing limits in the OpenStack API."""
|
||||
|
||||
@wsgi.serializers(xml=LimitsTemplate)
|
||||
def index(self, req):
|
||||
"""
|
||||
Return all global and rate limit information.
|
||||
"""
|
||||
"""Return all global and rate limit information."""
|
||||
context = req.environ['manila.context']
|
||||
quotas = QUOTAS.get_project_quotas(context, context.project_id,
|
||||
usages=False)
|
||||
@ -101,9 +97,7 @@ def create_resource():
|
||||
|
||||
|
||||
class Limit(object):
|
||||
"""
|
||||
Stores information about a limit for HTTP requests.
|
||||
"""
|
||||
"""Stores information about a limit for HTTP requests."""
|
||||
|
||||
UNITS = {
|
||||
1: "SECOND",
|
||||
@ -115,8 +109,7 @@ class Limit(object):
|
||||
UNIT_MAP = dict([(v, k) for k, v in UNITS.items()])
|
||||
|
||||
def __init__(self, verb, uri, regex, value, unit):
|
||||
"""
|
||||
Initialize a new `Limit`.
|
||||
"""Initialize a new `Limit`.
|
||||
|
||||
@param verb: HTTP verb (POST, PUT, etc.)
|
||||
@param uri: Human-readable URI
|
||||
@ -146,8 +139,7 @@ class Limit(object):
|
||||
self.error_message = msg % self.__dict__
|
||||
|
||||
def __call__(self, verb, url):
|
||||
"""
|
||||
Represents a call to this limit from a relevant request.
|
||||
"""Represents a call to this limit from a relevant request.
|
||||
|
||||
@param verb: string http verb (POST, GET, etc.)
|
||||
@param url: string URL
|
||||
@ -215,15 +207,16 @@ DEFAULT_LIMITS = [
|
||||
|
||||
|
||||
class RateLimitingMiddleware(base_wsgi.Middleware):
|
||||
"""
|
||||
Rate-limits requests passing through this middleware. All limit information
|
||||
is stored in memory for this implementation.
|
||||
"""Rate-limits requests passing through this middleware.
|
||||
|
||||
All limit information is stored in memory for this implementation.
|
||||
"""
|
||||
|
||||
def __init__(self, application, limits=None, limiter=None, **kwargs):
|
||||
"""
|
||||
Initialize new `RateLimitingMiddleware`, which wraps the given WSGI
|
||||
application and sets up the given limits.
|
||||
"""Initialize new `RateLimitingMiddleware`.
|
||||
|
||||
`RateLimitingMiddleware` wraps the given WSGI application and
|
||||
sets up the given limits.
|
||||
|
||||
@param application: WSGI application to wrap
|
||||
@param limits: String describing limits
|
||||
@ -247,13 +240,13 @@ class RateLimitingMiddleware(base_wsgi.Middleware):
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, req):
|
||||
"""
|
||||
Represents a single call through this middleware. We should record the
|
||||
request if we have a limit relevant to it. If no limit is relevant to
|
||||
the request, ignore it.
|
||||
"""Represents a single call through this middleware.
|
||||
|
||||
If the request should be rate limited, return a fault telling the user
|
||||
they are over the limit and need to retry later.
|
||||
We should record the request if we have a limit relevant to
|
||||
it. If no limit is relevant to the request, ignore it.
|
||||
|
||||
If the request should be rate limited, return a fault telling
|
||||
the user they are over the limit and need to retry later.
|
||||
"""
|
||||
verb = req.method
|
||||
url = req.url
|
||||
@ -277,13 +270,10 @@ class RateLimitingMiddleware(base_wsgi.Middleware):
|
||||
|
||||
|
||||
class Limiter(object):
|
||||
"""
|
||||
Rate-limit checking class which handles limits in memory.
|
||||
"""
|
||||
"""Rate-limit checking class which handles limits in memory."""
|
||||
|
||||
def __init__(self, limits, **kwargs):
|
||||
"""
|
||||
Initialize the new `Limiter`.
|
||||
"""Initialize the new `Limiter`.
|
||||
|
||||
@param limits: List of `Limit` objects
|
||||
"""
|
||||
@ -297,14 +287,11 @@ class Limiter(object):
|
||||
self.levels[username] = self.parse_limits(value)
|
||||
|
||||
def get_limits(self, username=None):
|
||||
"""
|
||||
Return the limits for a given user.
|
||||
"""
|
||||
"""Return the limits for a given user."""
|
||||
return [limit.display() for limit in self.levels[username]]
|
||||
|
||||
def check_for_delay(self, verb, url, username=None):
|
||||
"""
|
||||
Check the given verb/user/user triplet for limit.
|
||||
"""Check the given verb/user/user triplet for limit.
|
||||
|
||||
@return: Tuple of delay (in seconds) and error message (or None, None)
|
||||
"""
|
||||
@ -328,9 +315,9 @@ class Limiter(object):
|
||||
# default limit parsing.
|
||||
@staticmethod
|
||||
def parse_limits(limits):
|
||||
"""
|
||||
Convert a string into a list of Limit instances. This
|
||||
implementation expects a semicolon-separated sequence of
|
||||
"""Convert a string into a list of Limit instances.
|
||||
|
||||
This implementation expects a semicolon-separated sequence of
|
||||
parenthesized groups, where each group contains a
|
||||
comma-separated sequence consisting of HTTP method,
|
||||
user-readable URI, a URI reg-exp, an integer number of
|
||||
@ -383,9 +370,9 @@ class Limiter(object):
|
||||
|
||||
|
||||
class WsgiLimiter(object):
|
||||
"""
|
||||
Rate-limit checking from a WSGI application. Uses an in-memory `Limiter`.
|
||||
"""Rate-limit checking from a WSGI application.
|
||||
|
||||
Uses an in-memory `Limiter`.
|
||||
To use, POST ``/<username>`` with JSON data such as::
|
||||
|
||||
{
|
||||
@ -399,8 +386,7 @@ class WsgiLimiter(object):
|
||||
"""
|
||||
|
||||
def __init__(self, limits=None):
|
||||
"""
|
||||
Initialize the new `WsgiLimiter`.
|
||||
"""Initialize the new `WsgiLimiter`.
|
||||
|
||||
@param limits: List of `Limit` objects
|
||||
"""
|
||||
@ -408,10 +394,11 @@ class WsgiLimiter(object):
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, request):
|
||||
"""
|
||||
Handles a call to this application. Returns 204 if the request is
|
||||
acceptable to the limiter, else a 403 is returned with a relevant
|
||||
header indicating when the request *will* succeed.
|
||||
"""Handles a call to this application.
|
||||
|
||||
Returns 204 if the request is acceptable to the limiter, else
|
||||
a 403 is returned with a relevant header indicating when the
|
||||
request *will* succeed.
|
||||
"""
|
||||
if request.method != "POST":
|
||||
raise webob.exc.HTTPMethodNotAllowed()
|
||||
@ -435,13 +422,10 @@ class WsgiLimiter(object):
|
||||
|
||||
|
||||
class WsgiLimiterProxy(object):
|
||||
"""
|
||||
Rate-limit requests based on answers from a remote source.
|
||||
"""
|
||||
"""Rate-limit requests based on answers from a remote source."""
|
||||
|
||||
def __init__(self, limiter_address):
|
||||
"""
|
||||
Initialize the new `WsgiLimiterProxy`.
|
||||
"""Initialize the new `WsgiLimiterProxy`.
|
||||
|
||||
@param limiter_address: IP/port combination of where to request limit
|
||||
"""
|
||||
@ -472,9 +456,9 @@ class WsgiLimiterProxy(object):
|
||||
# decisions are made by a remote server.
|
||||
@staticmethod
|
||||
def parse_limits(limits):
|
||||
"""
|
||||
Ignore a limits string--simply doesn't apply for the limit
|
||||
proxy.
|
||||
"""Ignore a limits string.
|
||||
|
||||
This simply doesn't apply for the limit proxy.
|
||||
|
||||
@return: Empty list.
|
||||
"""
|
||||
|
@ -39,7 +39,8 @@ LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class APIRouter(manila.api.openstack.APIRouter):
|
||||
"""
|
||||
"""Route API requests.
|
||||
|
||||
Routes requests on the OpenStack API to the appropriate controller
|
||||
and method.
|
||||
"""
|
||||
|
@ -26,7 +26,8 @@ def get_view_builder(req):
|
||||
|
||||
class ViewBuilder(object):
|
||||
def __init__(self, base_url):
|
||||
"""
|
||||
"""Initialize ViewBuilder.
|
||||
|
||||
:param base_url: url of the root wsgi application
|
||||
"""
|
||||
self.base_url = base_url
|
||||
|
@ -864,9 +864,7 @@ class TemplateBuilder(object):
|
||||
|
||||
|
||||
def make_links(parent, selector=None):
|
||||
"""
|
||||
Attach an Atom <links> element to the parent.
|
||||
"""
|
||||
"""Attach an Atom <links> element to the parent."""
|
||||
|
||||
elem = SubTemplateElement(parent, '{%s}link' % XMLNS_ATOM,
|
||||
selector=selector)
|
||||
@ -879,7 +877,8 @@ def make_links(parent, selector=None):
|
||||
|
||||
|
||||
def make_flat_dict(name, selector=None, subselector=None, ns=None):
|
||||
"""
|
||||
"""Utility for simple XML templates.
|
||||
|
||||
Utility for simple XML templates that traditionally used
|
||||
XMLDictSerializer with no metadata. Returns a template element
|
||||
where the top-level element has the given tag name, and where
|
||||
|
@ -36,8 +36,7 @@ CONF = cfg.CONF
|
||||
|
||||
|
||||
def _get_my_ip():
|
||||
"""
|
||||
Returns the actual ip of the local machine.
|
||||
"""Returns the actual ip of the local machine.
|
||||
|
||||
This code figures out what source address would be used if some traffic
|
||||
were to be sent out to some well known address on the Internet. In this
|
||||
|
@ -48,7 +48,8 @@ class RequestContext(object):
|
||||
roles=None, remote_address=None, timestamp=None,
|
||||
request_id=None, auth_token=None, overwrite=True,
|
||||
quota_class=None, service_catalog=None, **kwargs):
|
||||
"""
|
||||
"""Initialize RequestContext.
|
||||
|
||||
:param read_deleted: 'no' indicates deleted records are hidden, 'yes'
|
||||
indicates deleted records are visible, 'only' indicates that
|
||||
*only* deleted records are visible.
|
||||
|
@ -334,7 +334,9 @@ class IpRouteCommand(IpDeviceCommandBase):
|
||||
return retval
|
||||
|
||||
def pullup_route(self, interface_name):
|
||||
"""Ensures that the route entry for the interface is before all
|
||||
"""Pullup route entry.
|
||||
|
||||
Ensures that the route entry for the interface is before all
|
||||
others on the same subnet.
|
||||
"""
|
||||
device_list = []
|
||||
|
@ -34,9 +34,10 @@ class NeutronNetworkPlugin(manila_network.NetworkBaseAPI, db_base.Base):
|
||||
self.neutron_api = neutron_api.API()
|
||||
|
||||
def allocate_network(self, context, share_server, share_network, **kwargs):
|
||||
"""Allocate network resources using given network information: create
|
||||
neutron ports for a given neutron network and subnet, create manila db
|
||||
records for allocated neutron ports.
|
||||
"""Allocate network resources using given network information.
|
||||
|
||||
Create neutron ports for a given neutron network and subnet,
|
||||
create manila db records for allocated neutron ports.
|
||||
|
||||
:param context: RequestContext object
|
||||
:param share_network: share network data
|
||||
@ -64,9 +65,10 @@ class NeutronNetworkPlugin(manila_network.NetworkBaseAPI, db_base.Base):
|
||||
return ports
|
||||
|
||||
def deallocate_network(self, context, share_server):
|
||||
"""Deallocate neutron network resources for the given network info:
|
||||
delete previously allocated neutron ports, delete manila db records for
|
||||
deleted ports.
|
||||
"""Deallocate neutron network resources for the given network info.
|
||||
|
||||
Delete previously allocated neutron ports, delete manila db
|
||||
records for deleted ports.
|
||||
|
||||
:param context: RequestContext object
|
||||
:param share_network: share network data
|
||||
|
@ -84,8 +84,7 @@ def check_is_admin(roles):
|
||||
|
||||
|
||||
def wrap_check_policy(resource):
|
||||
"""Check policy corresponding to the wrapped methods prior to execution.
|
||||
"""
|
||||
"""Check policy corresponding to the wrapped methods prior to execution."""
|
||||
def check_policy_wraper(func):
|
||||
@functools.wraps(func)
|
||||
def wrapped(self, context, target_obj, *args, **kwargs):
|
||||
|
@ -61,7 +61,8 @@ CONF.register_opts(quota_opts)
|
||||
|
||||
|
||||
class DbQuotaDriver(object):
|
||||
"""
|
||||
"""Database Quota driver.
|
||||
|
||||
Driver to perform necessary checks to enforce quotas and obtain
|
||||
quota information. The default driver utilizes the local
|
||||
database.
|
||||
@ -98,7 +99,8 @@ class DbQuotaDriver(object):
|
||||
|
||||
def get_class_quotas(self, context, resources, quota_class,
|
||||
defaults=True):
|
||||
"""
|
||||
"""Retrieve quotas for a quota class.
|
||||
|
||||
Given a list of resources, retrieve the quotas for the given
|
||||
quota class.
|
||||
|
||||
@ -172,7 +174,8 @@ class DbQuotaDriver(object):
|
||||
def get_project_quotas(self, context, resources, project_id,
|
||||
quota_class=None, defaults=True,
|
||||
usages=True, remains=False):
|
||||
"""
|
||||
"""Retrieve quotas for project.
|
||||
|
||||
Given a list of resources, retrieve the quotas for the given
|
||||
project.
|
||||
|
||||
@ -206,7 +209,8 @@ class DbQuotaDriver(object):
|
||||
def get_user_quotas(self, context, resources, project_id, user_id,
|
||||
quota_class=None, defaults=True,
|
||||
usages=True):
|
||||
"""
|
||||
"""Retrieve quotas for user and project.
|
||||
|
||||
Given a list of resources, retrieve the quotas for the given
|
||||
user and project.
|
||||
|
||||
@ -243,7 +247,8 @@ class DbQuotaDriver(object):
|
||||
|
||||
def get_settable_quotas(self, context, resources, project_id,
|
||||
user_id=None):
|
||||
"""
|
||||
"""Retrieve range of settable quotas.
|
||||
|
||||
Given a list of resources, retrieve the range of settable quotas for
|
||||
the given user or project.
|
||||
|
||||
@ -275,7 +280,8 @@ class DbQuotaDriver(object):
|
||||
|
||||
def _get_quotas(self, context, resources, keys, has_sync, project_id=None,
|
||||
user_id=None):
|
||||
"""
|
||||
"""Retrieve quotas for a resource.
|
||||
|
||||
A helper method which retrieves the quotas for the specific
|
||||
resources identified by keys, and which apply to the current
|
||||
context.
|
||||
@ -503,7 +509,8 @@ class DbQuotaDriver(object):
|
||||
user_id=user_id)
|
||||
|
||||
def usage_reset(self, context, resources):
|
||||
"""
|
||||
"""Reset usage records.
|
||||
|
||||
Reset the usage records for a particular user on a list of
|
||||
resources. This will force that user's usage records to be
|
||||
refreshed the next time a reservation is made.
|
||||
@ -533,7 +540,8 @@ class DbQuotaDriver(object):
|
||||
pass
|
||||
|
||||
def destroy_all_by_project(self, context, project_id):
|
||||
"""
|
||||
"""Destroy metadata associated with a project.
|
||||
|
||||
Destroy all quotas, usages, and reservations associated with a
|
||||
project.
|
||||
|
||||
@ -544,7 +552,8 @@ class DbQuotaDriver(object):
|
||||
db.quota_destroy_all_by_project(context, project_id)
|
||||
|
||||
def destroy_all_by_project_and_user(self, context, project_id, user_id):
|
||||
"""
|
||||
"""Destroy metadata associated with a project and user.
|
||||
|
||||
Destroy all quotas, usages, and reservations associated with a
|
||||
project and user.
|
||||
|
||||
@ -571,8 +580,7 @@ class BaseResource(object):
|
||||
"""Describe a single resource for quota checking."""
|
||||
|
||||
def __init__(self, name, flag=None):
|
||||
"""
|
||||
Initializes a Resource.
|
||||
"""Initializes a Resource.
|
||||
|
||||
:param name: The name of the resource, i.e., "shares".
|
||||
:param flag: The name of the flag or configuration option
|
||||
@ -584,7 +592,8 @@ class BaseResource(object):
|
||||
self.flag = flag
|
||||
|
||||
def quota(self, driver, context, **kwargs):
|
||||
"""
|
||||
"""Obtain quota for a resource.
|
||||
|
||||
Given a driver and context, obtain the quota for this
|
||||
resource.
|
||||
|
||||
@ -641,8 +650,7 @@ class ReservableResource(BaseResource):
|
||||
"""Describe a reservable resource."""
|
||||
|
||||
def __init__(self, name, sync, flag=None):
|
||||
"""
|
||||
Initializes a ReservableResource.
|
||||
"""Initializes a ReservableResource.
|
||||
|
||||
Reservable resources are those resources which directly
|
||||
correspond to objects in the database, i.e., shares, gigabytes,
|
||||
@ -680,14 +688,14 @@ class AbsoluteResource(BaseResource):
|
||||
|
||||
|
||||
class CountableResource(AbsoluteResource):
|
||||
"""
|
||||
"""Describe a countable resource.
|
||||
|
||||
Describe a resource where the counts aren't based solely on the
|
||||
project ID.
|
||||
"""
|
||||
|
||||
def __init__(self, name, count, flag=None):
|
||||
"""
|
||||
Initializes a CountableResource.
|
||||
"""Initializes a CountableResource.
|
||||
|
||||
Countable resources are those resources which directly
|
||||
correspond to objects in the database, i.e., shares, gigabytes,
|
||||
@ -1000,7 +1008,8 @@ class QuotaEngine(object):
|
||||
LOG.debug("Rolled back reservations %s", reservations)
|
||||
|
||||
def usage_reset(self, context, resources):
|
||||
"""
|
||||
"""Reset usage records.
|
||||
|
||||
Reset the usage records for a particular user on a list of
|
||||
resources. This will force that user's usage records to be
|
||||
refreshed the next time a reservation is made.
|
||||
@ -1017,7 +1026,8 @@ class QuotaEngine(object):
|
||||
self._driver.usage_reset(context, resources)
|
||||
|
||||
def destroy_all_by_project_and_user(self, context, project_id, user_id):
|
||||
"""
|
||||
"""Destroy metadata associated with a project and user.
|
||||
|
||||
Destroy all quotas, usages, and reservations associated with a
|
||||
project and user.
|
||||
|
||||
@ -1030,7 +1040,8 @@ class QuotaEngine(object):
|
||||
project_id, user_id)
|
||||
|
||||
def destroy_all_by_project(self, context, project_id):
|
||||
"""
|
||||
"""Destroy metadate associated with a project.
|
||||
|
||||
Destroy all quotas, usages, and reservations associated with a
|
||||
project.
|
||||
|
||||
|
@ -43,7 +43,8 @@ LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SchedulerOptions(object):
|
||||
"""
|
||||
"""Monitor and load local .json file for filtering and weighing.
|
||||
|
||||
SchedulerOptions monitors a local .json file for changes and loads it
|
||||
if needed. This file is converted to a data structure and passed into
|
||||
the filtering and weighing functions which can use it for dynamic
|
||||
|
@ -31,10 +31,11 @@ ATOMNS = "{http://www.w3.org/2005/Atom}"
|
||||
|
||||
|
||||
class LimiterTest(test.TestCase):
|
||||
"""
|
||||
Unit tests for the `manila.api.common.limited` method which takes
|
||||
in a list of items and, depending on the 'offset' and 'limit' GET params,
|
||||
returns a subset or complete set of the given items.
|
||||
"""Unit tests for the `manila.api.common.limited` method.
|
||||
|
||||
Takes in a list of items and, depending on the 'offset' and
|
||||
'limit' GET params, returns a subset or complete set of the given
|
||||
items.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
@ -155,10 +156,10 @@ class LimiterTest(test.TestCase):
|
||||
|
||||
|
||||
class PaginationParamsTest(test.TestCase):
|
||||
"""
|
||||
Unit tests for the `manila.api.common.get_pagination_params`
|
||||
method which takes in a request object and returns 'marker' and 'limit'
|
||||
GET params.
|
||||
"""Unit tests for the `manila.api.common.get_pagination_params` method.
|
||||
|
||||
Takes in a request object and returns 'marker' and 'limit' GET
|
||||
params.
|
||||
"""
|
||||
|
||||
def test_no_params(self):
|
||||
|
@ -330,7 +330,8 @@ class LimitTest(BaseLimitTestSuite):
|
||||
|
||||
|
||||
class ParseLimitsTest(BaseLimitTestSuite):
|
||||
"""
|
||||
"""Test default limits parser.
|
||||
|
||||
Tests for the default limits parser in the in-memory
|
||||
`limits.Limiter` class.
|
||||
"""
|
||||
@ -415,7 +416,8 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
return sum(item for item in results if item)
|
||||
|
||||
def test_no_delay_GET(self):
|
||||
"""
|
||||
"""Test no delay on GET for single call.
|
||||
|
||||
Simple test to ensure no delay on a single call for a limit verb we
|
||||
didn"t set.
|
||||
"""
|
||||
@ -423,14 +425,16 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
self.assertEqual(delay, (None, None))
|
||||
|
||||
def test_no_delay_PUT(self):
|
||||
"""
|
||||
"""Test no delay on single call.
|
||||
|
||||
Simple test to ensure no delay on a single call for a known limit.
|
||||
"""
|
||||
delay = self.limiter.check_for_delay("PUT", "/anything")
|
||||
self.assertEqual(delay, (None, None))
|
||||
|
||||
def test_delay_PUT(self):
|
||||
"""
|
||||
"""Ensure 11th PUT will be delayed.
|
||||
|
||||
Ensure the 11th PUT will result in a delay of 6.0 seconds until
|
||||
the next request will be granced.
|
||||
"""
|
||||
@ -440,7 +444,8 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
def test_delay_POST(self):
|
||||
"""
|
||||
"""Ensure 8th POST will be delayed.
|
||||
|
||||
Ensure the 8th POST will result in a delay of 6.0 seconds until
|
||||
the next request will be granced.
|
||||
"""
|
||||
@ -460,7 +465,8 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
def test_delay_PUT_volumes(self):
|
||||
"""
|
||||
"""Ensure PUT limits.
|
||||
|
||||
Ensure PUT on /volumes limits at 5 requests, and PUT elsewhere is still
|
||||
OK after 5 requests...but then after 11 total requests, PUT limiting
|
||||
kicks in.
|
||||
@ -476,7 +482,8 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
def test_delay_PUT_wait(self):
|
||||
"""
|
||||
"""Test limit handling.
|
||||
|
||||
Ensure after hitting the limit and then waiting for the correct
|
||||
amount of time, the limit will be lifted.
|
||||
"""
|
||||
@ -628,7 +635,8 @@ class FakeHttplibConnection(object):
|
||||
self.host = host
|
||||
|
||||
def request(self, method, path, body="", headers=None):
|
||||
"""
|
||||
"""Transalate request to WSGI app.
|
||||
|
||||
Requests made via this connection actually get translated and routed
|
||||
into our WSGI app, we then wait for the response and turn it back into
|
||||
an `httplib.HTTPResponse`.
|
||||
|
@ -141,9 +141,10 @@ class ManilaMigrationsCheckers(test_migrations.WalkVersionsMixin):
|
||||
raise
|
||||
|
||||
def test_walk_versions(self):
|
||||
"""
|
||||
Walks all version scripts for each tested database, ensuring
|
||||
that there are no errors in the version scripts for each engine
|
||||
"""Walks all version scripts for each tested database.
|
||||
|
||||
While walking, ensur that there are no errors in the version
|
||||
scripts for each engine.
|
||||
"""
|
||||
with mock.patch('manila.db.sqlalchemy.api.get_engine',
|
||||
return_value=self.engine):
|
||||
|
@ -71,8 +71,10 @@ class LintOutput(object):
|
||||
|
||||
@classmethod
|
||||
def from_msg_to_dict(cls, msg):
|
||||
"""From the output of pylint msg, to a dict, where each key
|
||||
is a unique error identifier, value is a list of LintOutput
|
||||
"""From the output of pylint msg, to a dict.
|
||||
|
||||
Each key is a unique error identifier, value is a list of
|
||||
LintOutput.
|
||||
"""
|
||||
result = {}
|
||||
for line in msg.splitlines():
|
||||
|
2
tox.ini
2
tox.ini
@ -50,6 +50,6 @@ commands = bash tools/lintstack.sh
|
||||
#
|
||||
# H904 wrap long lines in parentheses instead of a backslash
|
||||
# reason: removed in hacking (https://review.openstack.org/#/c/101701/)
|
||||
ignore = H404,H405,H501,H904
|
||||
ignore = H405,H501,H904
|
||||
builtins = _
|
||||
exclude = .venv,.tox,dist,doc,openstack,*egg
|
||||
|
Loading…
Reference in New Issue
Block a user