summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keystoneclient/access.py60
-rw-r--r--keystoneclient/auth/identity/generic/base.py4
-rw-r--r--keystoneclient/base.py4
-rw-r--r--keystoneclient/common/cms.py8
-rw-r--r--keystoneclient/contrib/revoke/model.py2
-rw-r--r--keystoneclient/discover.py2
-rw-r--r--keystoneclient/exceptions.py2
-rw-r--r--keystoneclient/generic/client.py10
-rw-r--r--keystoneclient/httpclient.py8
-rw-r--r--keystoneclient/session.py4
-rw-r--r--keystoneclient/tests/functional/base.py2
-rw-r--r--keystoneclient/tests/unit/v3/test_projects.py2
-rw-r--r--keystoneclient/tests/unit/v3/utils.py2
-rw-r--r--keystoneclient/utils.py2
-rw-r--r--keystoneclient/v2_0/roles.py4
-rw-r--r--keystoneclient/v2_0/tokens.py2
-rw-r--r--keystoneclient/v3/contrib/endpoint_filter.py2
-rw-r--r--keystoneclient/v3/role_assignments.py2
-rw-r--r--keystoneclient/v3/roles.py8
-rw-r--r--tox.ini3
20 files changed, 66 insertions, 67 deletions
diff --git a/keystoneclient/access.py b/keystoneclient/access.py
index 7f4f988..6f22a08 100644
--- a/keystoneclient/access.py
+++ b/keystoneclient/access.py
@@ -97,7 +97,7 @@ class AccessInfo(dict):
return self.get('region_name')
def will_expire_soon(self, stale_duration=None):
- """Determines if expiration is about to occur.
+ """Determine if expiration is about to occur.
:returns: true if expiration is within the given duration
:rtype: boolean
@@ -114,7 +114,7 @@ class AccessInfo(dict):
@classmethod
def is_valid(cls, body, **kwargs):
- """Determines if processing valid v2 or v3 token.
+ """Determine if processing valid v2 or v3 token.
Validates from the auth body or a user-provided dict.
@@ -124,7 +124,7 @@ class AccessInfo(dict):
raise NotImplementedError()
def has_service_catalog(self):
- """Returns true if the authorization token has a service catalog.
+ """Return true if the authorization token has a service catalog.
:returns: boolean
"""
@@ -132,7 +132,7 @@ class AccessInfo(dict):
@property
def auth_token(self):
- """Returns the token_id associated with the auth request.
+ """Return the token_id associated with the auth request.
To be used in headers for authenticating OpenStack API requests.
@@ -153,7 +153,7 @@ class AccessInfo(dict):
@property
def expires(self):
- """Returns the token expiration (as datetime object)
+ """Return the token expiration (as datetime object)
:returns: datetime
"""
@@ -161,7 +161,7 @@ class AccessInfo(dict):
@property
def issued(self):
- """Returns the token issue time (as datetime object)
+ """Return the token issue time (as datetime object)
:returns: datetime
"""
@@ -169,7 +169,7 @@ class AccessInfo(dict):
@property
def username(self):
- """Returns the username associated with the auth request.
+ """Return the username associated with the auth request.
Follows the pattern defined in the V2 API of first looking for 'name',
returning that if available, and falling back to 'username' if name
@@ -181,7 +181,7 @@ class AccessInfo(dict):
@property
def user_id(self):
- """Returns the user id associated with the auth request.
+ """Return the user id associated with the auth request.
:returns: str
"""
@@ -189,7 +189,7 @@ class AccessInfo(dict):
@property
def user_domain_id(self):
- """Returns the user's domain id associated with the auth request.
+ """Return the user's domain id associated with the auth request.
For v2, it always returns 'default' which may be different from the
Keystone configuration.
@@ -200,7 +200,7 @@ class AccessInfo(dict):
@property
def user_domain_name(self):
- """Returns the user's domain name associated with the auth request.
+ """Return the user's domain name associated with the auth request.
For v2, it always returns 'Default' which may be different from the
Keystone configuration.
@@ -211,7 +211,7 @@ class AccessInfo(dict):
@property
def role_ids(self):
- """Returns a list of user's role ids associated with the auth request.
+ """Return a list of user's role ids associated with the auth request.
:returns: a list of strings of role ids
"""
@@ -219,7 +219,7 @@ class AccessInfo(dict):
@property
def role_names(self):
- """Returns a list of user's role names associated with the auth request.
+ """Return a list of user's role names associated with the auth request.
:returns: a list of strings of role names
"""
@@ -227,7 +227,7 @@ class AccessInfo(dict):
@property
def domain_name(self):
- """Returns the domain name associated with the auth request.
+ """Return the domain name associated with the auth request.
:returns: str or None (if no domain associated with the token)
"""
@@ -235,7 +235,7 @@ class AccessInfo(dict):
@property
def domain_id(self):
- """Returns the domain id associated with the auth request.
+ """Return the domain id associated with the auth request.
:returns: str or None (if no domain associated with the token)
"""
@@ -243,7 +243,7 @@ class AccessInfo(dict):
@property
def project_name(self):
- """Returns the project name associated with the auth request.
+ """Return the project name associated with the auth request.
:returns: str or None (if no project associated with the token)
"""
@@ -256,9 +256,9 @@ class AccessInfo(dict):
@property
def scoped(self):
- """Returns true if the auth token was scoped.
+ """Return true if the auth token was scoped.
- Returns true if scoped to a tenant(project) or domain,
+ Return true if scoped to a tenant(project) or domain,
and contains a populated service catalog.
.. warning::
@@ -272,7 +272,7 @@ class AccessInfo(dict):
@property
def project_scoped(self):
- """Returns true if the auth token was scoped to a tenant(project).
+ """Return true if the auth token was scoped to a tenant(project).
:returns: bool
"""
@@ -280,7 +280,7 @@ class AccessInfo(dict):
@property
def domain_scoped(self):
- """Returns true if the auth token was scoped to a domain.
+ """Return true if the auth token was scoped to a domain.
:returns: bool
"""
@@ -288,7 +288,7 @@ class AccessInfo(dict):
@property
def trust_id(self):
- """Returns the trust id associated with the auth request.
+ """Return the trust id associated with the auth request.
:returns: str or None (if no trust associated with the token)
"""
@@ -296,7 +296,7 @@ class AccessInfo(dict):
@property
def trust_scoped(self):
- """Returns true if the auth token was scoped from a delegated trust.
+ """Return true if the auth token was scoped from a delegated trust.
The trust delegation is via the OS-TRUST v3 extension.
@@ -306,7 +306,7 @@ class AccessInfo(dict):
@property
def trustee_user_id(self):
- """Returns the trustee user id associated with a trust.
+ """Return the trustee user id associated with a trust.
:returns: str or None (if no trust associated with the token)
"""
@@ -314,7 +314,7 @@ class AccessInfo(dict):
@property
def trustor_user_id(self):
- """Returns the trustor user id associated with a trust.
+ """Return the trustor user id associated with a trust.
:returns: str or None (if no trust associated with the token)
"""
@@ -322,7 +322,7 @@ class AccessInfo(dict):
@property
def project_id(self):
- """Returns the project ID associated with the auth request.
+ """Return the project ID associated with the auth request.
This returns None if the auth token wasn't scoped to a project.
@@ -337,7 +337,7 @@ class AccessInfo(dict):
@property
def project_domain_id(self):
- """Returns the project's domain id associated with the auth request.
+ """Return the project's domain id associated with the auth request.
For v2, it returns 'default' if a project is scoped or None which may
be different from the keystone configuration.
@@ -348,7 +348,7 @@ class AccessInfo(dict):
@property
def project_domain_name(self):
- """Returns the project's domain name associated with the auth request.
+ """Return the project's domain name associated with the auth request.
For v2, it returns 'Default' if a project is scoped or None which may
be different from the keystone configuration.
@@ -359,7 +359,7 @@ class AccessInfo(dict):
@property
def auth_url(self):
- """Returns a tuple of identity URLs.
+ """Return a tuple of identity URLs.
The identity URLs are from publicURL and adminURL for the service
'identity' from the service catalog associated with the authorization
@@ -376,7 +376,7 @@ class AccessInfo(dict):
@property
def management_url(self):
- """Returns the first adminURL of the identity endpoint.
+ """Return the first adminURL of the identity endpoint.
The identity endpoint is from the service catalog
associated with the authorization request, or None if the
@@ -392,7 +392,7 @@ class AccessInfo(dict):
@property
def version(self):
- """Returns the version of the auth token from identity service.
+ """Return the version of the auth token from identity service.
:returns: str
"""
@@ -416,7 +416,7 @@ class AccessInfo(dict):
@property
def is_federated(self):
- """Returns true if federation was used to get the token.
+ """Return true if federation was used to get the token.
:returns: boolean
"""
diff --git a/keystoneclient/auth/identity/generic/base.py b/keystoneclient/auth/identity/generic/base.py
index b34d186..84171e4 100644
--- a/keystoneclient/auth/identity/generic/base.py
+++ b/keystoneclient/auth/identity/generic/base.py
@@ -114,14 +114,14 @@ class BaseGenericPlugin(base.BaseIdentityPlugin):
@property
def _v2_params(self):
- """Parameters that are common to v2 plugins."""
+ """Return parameters that are common to v2 plugins."""
return {'trust_id': self._trust_id,
'tenant_id': self._project_id,
'tenant_name': self._project_name}
@property
def _v3_params(self):
- """Parameters that are common to v3 plugins."""
+ """Return parameters that are common to v3 plugins."""
return {'trust_id': self._trust_id,
'project_id': self._project_id,
'project_name': self._project_name,
diff --git a/keystoneclient/base.py b/keystoneclient/base.py
index b550ae9..ddd97fa 100644
--- a/keystoneclient/base.py
+++ b/keystoneclient/base.py
@@ -298,7 +298,7 @@ class CrudManager(Manager):
base_url = None
def build_url(self, dict_args_in_out=None):
- """Builds a resource URL for the given kwargs.
+ """Build a resource URL for the given kwargs.
Given an example collection where `collection_key = 'entities'` and
`key = 'entity'`, the following URL's could be generated.
@@ -355,7 +355,7 @@ class CrudManager(Manager):
return '?%s' % urllib.parse.urlencode(params) if params else ''
def build_key_only_query(self, params_list):
- """Builds a query that does not include values, just keys.
+ """Build a query that does not include values, just keys.
The Identity API has some calls that define queries without values,
this can not be accomplished by using urllib.parse.urlencode(). This
diff --git a/keystoneclient/common/cms.py b/keystoneclient/common/cms.py
index 704b645..49876d3 100644
--- a/keystoneclient/common/cms.py
+++ b/keystoneclient/common/cms.py
@@ -153,7 +153,7 @@ def _encoding_for_form(inform):
def cms_verify(formatted, signing_cert_file_name, ca_file_name,
inform=PKI_ASN1_FORM):
- """Verifies the signature of the contents IAW CMS syntax.
+ """Verify the signature of the contents IAW CMS syntax.
:raises subprocess.CalledProcessError:
:raises keystoneclient.exceptions.CertificateConfigError: if certificate
@@ -241,7 +241,7 @@ def pkiz_verify(signed_text, signing_cert_file_name, ca_file_name):
def token_to_cms(signed_text):
- """Converts a custom formatted token to a PEM-formatted token.
+ """Convert a custom formatted token to a PEM-formatted token.
See documentation for cms_to_token() for details on the custom formatting.
"""
@@ -329,7 +329,7 @@ def cms_sign_text(data_to_sign, signing_cert_file_name, signing_key_file_name,
def cms_sign_data(data_to_sign, signing_cert_file_name, signing_key_file_name,
outform=PKI_ASN1_FORM,
message_digest=DEFAULT_TOKEN_DIGEST_ALGORITHM):
- """Uses OpenSSL to sign a document.
+ """Use OpenSSL to sign a document.
Produces a Base64 encoding of a DER formatted CMS Document
http://en.wikipedia.org/wiki/Cryptographic_Message_Syntax
@@ -386,7 +386,7 @@ def cms_sign_token(text, signing_cert_file_name, signing_key_file_name,
def cms_to_token(cms_text):
- """Converts a CMS-signed token in PEM format to a custom URL-safe format.
+ """Convert a CMS-signed token in PEM format to a custom URL-safe format.
The conversion consists of replacing '/' char in the PEM-formatted token
with the '-' char and doing other such textual replacements to make the
diff --git a/keystoneclient/contrib/revoke/model.py b/keystoneclient/contrib/revoke/model.py
index 98c9017..925847c 100644
--- a/keystoneclient/contrib/revoke/model.py
+++ b/keystoneclient/contrib/revoke/model.py
@@ -107,7 +107,7 @@ class RevokeTree(object):
self.add_events(revoke_events)
def add_event(self, event):
- """Updates the tree based on a revocation event.
+ """Update the tree based on a revocation event.
Creates any necessary internal nodes in the tree corresponding to the
fields of the revocation event. The leaf node will always be set to
diff --git a/keystoneclient/discover.py b/keystoneclient/discover.py
index 8de0d53..d316fdc 100644
--- a/keystoneclient/discover.py
+++ b/keystoneclient/discover.py
@@ -339,7 +339,7 @@ class Discover(_discover.Discover):
def add_catalog_discover_hack(service_type, old, new):
- """Adds a version removal rule for a particular service.
+ """Add a version removal rule for a particular service.
Originally deployments of OpenStack would contain a versioned endpoint in
the catalog for different services. E.g. an identity service might look
diff --git a/keystoneclient/exceptions.py b/keystoneclient/exceptions.py
index 0bbd35a..83bf57a 100644
--- a/keystoneclient/exceptions.py
+++ b/keystoneclient/exceptions.py
@@ -337,7 +337,7 @@ An alias of :py:exc:`keystoneauth1.exceptions.http.HttpVersionNotSupported`
"""
from_response = _exc.from_response
-"""Returns an instance of :class:`HttpError` or subclass based on response.
+"""Return an instance of :class:`HttpError` or subclass based on response.
An alias of :py:func:`keystoneauth1.exceptions.http.from_response`
"""
diff --git a/keystoneclient/generic/client.py b/keystoneclient/generic/client.py
index f61edec..6d04802 100644
--- a/keystoneclient/generic/client.py
+++ b/keystoneclient/generic/client.py
@@ -75,14 +75,14 @@ class Client(httpclient.HTTPClient):
return self._local_keystone_exists()
def _local_keystone_exists(self):
- """Checks if Keystone is available on default local port 35357."""
+ """Check if Keystone is available on default local port 35357."""
results = self._check_keystone_versions("http://localhost:35357")
if results is None:
results = self._check_keystone_versions("https://localhost:35357")
return results
def _check_keystone_versions(self, url):
- """Calls Keystone URL and detects the available API versions."""
+ """Call Keystone URL and detects the available API versions."""
try:
resp, body = self._request(url, "GET",
headers={'Accept':
@@ -144,7 +144,7 @@ class Client(httpclient.HTTPClient):
return self._check_keystone_extensions(url)
def _check_keystone_extensions(self, url):
- """Calls Keystone URL and detects the available extensions."""
+ """Call Keystone URL and detects the available extensions."""
try:
if not url.endswith("/"):
url += '/'
@@ -173,7 +173,7 @@ class Client(httpclient.HTTPClient):
@staticmethod
def _get_version_info(version, root_url):
- """Parses version information.
+ """Parse version information.
:param version: a dict of a Keystone version response
:param root_url: string url used to construct
@@ -192,7 +192,7 @@ class Client(httpclient.HTTPClient):
@staticmethod
def _get_extension_info(extension):
- """Parses extension information.
+ """Parse extension information.
:param extension: a dict of a Keystone extension response
:returns: tuple - (alias, name)
diff --git a/keystoneclient/httpclient.py b/keystoneclient/httpclient.py
index 7517497..f56f130 100644
--- a/keystoneclient/httpclient.py
+++ b/keystoneclient/httpclient.py
@@ -447,11 +447,11 @@ class HTTPClient(baseclient.Client, base.BaseAuthPlugin):
@property
def service_catalog(self):
- """Returns this client's service catalog."""
+ """Return this client's service catalog."""
return self.auth_ref.service_catalog
def has_service_catalog(self):
- """Returns True if this client provides a service catalog."""
+ """Return True if this client provides a service catalog."""
return self.auth_ref and self.auth_ref.has_service_catalog()
@property
@@ -608,7 +608,7 @@ class HTTPClient(baseclient.Client, base.BaseAuthPlugin):
Used to store and retrieve auth_ref from keyring.
- Returns a slash-separated string of values ordered by key name.
+ Return a slash-separated string of values ordered by key name.
"""
return '/'.join([kwargs[k] or '?' for k in sorted(kwargs)])
@@ -751,7 +751,7 @@ class HTTPClient(baseclient.Client, base.BaseAuthPlugin):
return self._adapter.request(*args, **kwargs)
def _cs_request(self, url, method, management=True, **kwargs):
- """Makes an authenticated request to keystone endpoint.
+ """Make an authenticated request to keystone endpoint.
Request are made to keystone endpoint by concatenating
self.management_url and url and passing in method and
diff --git a/keystoneclient/session.py b/keystoneclient/session.py
index 056aa3d..4ebcba1 100644
--- a/keystoneclient/session.py
+++ b/keystoneclient/session.py
@@ -162,7 +162,7 @@ class Session(object):
@staticmethod
def _process_header(header):
- """Redacts the secure headers to be logged."""
+ """Redact the secure headers to be logged."""
secure_headers = ('authorization', 'x-auth-token',
'x-subject-token',)
if header[0].lower() in secure_headers:
@@ -545,7 +545,7 @@ class Session(object):
@classmethod
def construct(cls, kwargs):
- """Handles constructing a session from both old and new arguments.
+ """Handle constructing a session from both old and new arguments.
Support constructing a session from the old
:py:class:`~keystoneclient.httpclient.HTTPClient` args as well as the
diff --git a/keystoneclient/tests/functional/base.py b/keystoneclient/tests/functional/base.py
index 0b8d844..f3b8837 100644
--- a/keystoneclient/tests/functional/base.py
+++ b/keystoneclient/tests/functional/base.py
@@ -20,7 +20,7 @@ OPENSTACK_CLOUDS = ('functional_admin', 'devstack-admin', 'envvars')
def get_client(version):
- """Creates a keystoneclient instance to run functional tests
+ """Create a keystoneclient instance to run functional tests
The client is instantiated via os-client-config either based on a
clouds.yaml config file or from the environment variables.
diff --git a/keystoneclient/tests/unit/v3/test_projects.py b/keystoneclient/tests/unit/v3/test_projects.py
index 6edf4c6..54b8813 100644
--- a/keystoneclient/tests/unit/v3/test_projects.py
+++ b/keystoneclient/tests/unit/v3/test_projects.py
@@ -124,7 +124,7 @@ class ProjectTests(utils.ClientTestCase, utils.CrudTests):
self.assertEntityRequestBodyIs(ref)
def _create_projects_hierarchy(self, hierarchy_size=3):
- """Creates a project hierarchy with specified size.
+ """Create a project hierarchy with specified size.
:param hierarchy_size: the desired hierarchy size, default is 3.
diff --git a/keystoneclient/tests/unit/v3/utils.py b/keystoneclient/tests/unit/v3/utils.py
index bd1b970..2c9c86d 100644
--- a/keystoneclient/tests/unit/v3/utils.py
+++ b/keystoneclient/tests/unit/v3/utils.py
@@ -20,7 +20,7 @@ from keystoneclient.tests.unit import utils
def parameterize(ref):
- """Rewrites attributes to match the kwarg naming convention in client.
+ """Rewrite attributes to match the kwarg naming convention in client.
>>> parameterize({'project_id': 0})
{'project': 0}
diff --git a/keystoneclient/utils.py b/keystoneclient/utils.py
index 107f8f9..c20aa96 100644
--- a/keystoneclient/utils.py
+++ b/keystoneclient/utils.py
@@ -54,7 +54,7 @@ def find_resource(manager, name_or_id):
def unauthenticated(f):
- """Adds 'unauthenticated' attribute to decorated function.
+ """Add 'unauthenticated' attribute to decorated function.
Usage::
diff --git a/keystoneclient/v2_0/roles.py b/keystoneclient/v2_0/roles.py
index d0d3a79..d0d43a8 100644
--- a/keystoneclient/v2_0/roles.py
+++ b/keystoneclient/v2_0/roles.py
@@ -56,7 +56,7 @@ class RoleManager(base.ManagerWithFind):
return self._list("/users/%s/roles" % user_id, "roles")
def add_user_role(self, user, role, tenant=None):
- """Adds a role to a user.
+ """Add a role to a user.
If tenant is specified, the role is added just for that tenant,
otherwise the role is added globally.
@@ -72,7 +72,7 @@ class RoleManager(base.ManagerWithFind):
return self._update(route % (user_id, role_id), None, "roles")
def remove_user_role(self, user, role, tenant=None):
- """Removes a role from a user.
+ """Remove a role from a user.
If tenant is specified, the role is removed just for that tenant,
otherwise the role is removed from the user's global roles.
diff --git a/keystoneclient/v2_0/tokens.py b/keystoneclient/v2_0/tokens.py
index bf3a209..abf3ce5 100644
--- a/keystoneclient/v2_0/tokens.py
+++ b/keystoneclient/v2_0/tokens.py
@@ -117,7 +117,7 @@ class TokenManager(base.Manager):
return access.AccessInfo.factory(auth_token=token_id, body=body)
def get_revoked(self):
- """Returns the revoked tokens response.
+ """Return the revoked tokens response.
The response will be a dict containing 'signed' which is a CMS-encoded
document.
diff --git a/keystoneclient/v3/contrib/endpoint_filter.py b/keystoneclient/v3/contrib/endpoint_filter.py
index 0da79b8..5e50da7 100644
--- a/keystoneclient/v3/contrib/endpoint_filter.py
+++ b/keystoneclient/v3/contrib/endpoint_filter.py
@@ -58,7 +58,7 @@ class EndpointFilterManager(base.Manager):
return super(EndpointFilterManager, self)._delete(url=base_url)
def check_endpoint_in_project(self, project, endpoint):
- """Checks if project-endpoint association exist."""
+ """Check if project-endpoint association exist."""
if not (project and endpoint):
raise ValueError(_('project and endpoint are required'))
diff --git a/keystoneclient/v3/role_assignments.py b/keystoneclient/v3/role_assignments.py
index 1e85e83..edee0c9 100644
--- a/keystoneclient/v3/role_assignments.py
+++ b/keystoneclient/v3/role_assignments.py
@@ -49,7 +49,7 @@ class RoleAssignmentManager(base.CrudManager):
def list(self, user=None, group=None, project=None, domain=None, role=None,
effective=False, os_inherit_extension_inherited_to=None,
include_subtree=False, include_names=False):
- """Lists role assignments.
+ """List role assignments.
If no arguments are provided, all role assignments in the
system will be listed.
diff --git a/keystoneclient/v3/roles.py b/keystoneclient/v3/roles.py
index 1c00a69..92185ec 100644
--- a/keystoneclient/v3/roles.py
+++ b/keystoneclient/v3/roles.py
@@ -137,7 +137,7 @@ class RoleManager(base.CrudManager):
@positional(enforcement=positional.WARN)
def list(self, user=None, group=None, domain=None,
project=None, os_inherit_extension_inherited=False, **kwargs):
- """Lists roles and role grants.
+ """List roles and role grants.
If no arguments are provided, all roles in the system will be
listed.
@@ -179,7 +179,7 @@ class RoleManager(base.CrudManager):
@positional(enforcement=positional.WARN)
def grant(self, role, user=None, group=None, domain=None, project=None,
os_inherit_extension_inherited=False, **kwargs):
- """Grants a role to a user or group on a domain or project.
+ """Grant a role to a user or group on a domain or project.
If 'os_inherit_extension_inherited' is passed, then OS-INHERIT will be
used. It provides the ability for projects to inherit role assignments
@@ -200,7 +200,7 @@ class RoleManager(base.CrudManager):
@positional(enforcement=positional.WARN)
def check(self, role, user=None, group=None, domain=None, project=None,
os_inherit_extension_inherited=False, **kwargs):
- """Checks if a user or group has a role on a domain or project.
+ """Check if a user or group has a role on a domain or project.
If 'os_inherit_extension_inherited' is passed, then OS-INHERIT will be
used. It provides the ability for projects to inherit role assignments
@@ -223,7 +223,7 @@ class RoleManager(base.CrudManager):
@positional(enforcement=positional.WARN)
def revoke(self, role, user=None, group=None, domain=None, project=None,
os_inherit_extension_inherited=False, **kwargs):
- """Revokes a role from a user or group on a domain or project.
+ """Revoke a role from a user or group on a domain or project.
If 'os_inherit_extension_inherited' is passed, then OS-INHERIT will be
used. It provides the ability for projects to inherit role assignments
diff --git a/tox.ini b/tox.ini
index edc2ca0..11e80b7 100644
--- a/tox.ini
+++ b/tox.ini
@@ -56,8 +56,7 @@ passenv = OS_*
# D211: No blank lines allowed before class docstring
# D301: Use r”“” if any backslashes in a docstring
# D400: First line should end with a period.
-# D401: First line should be in imperative mood.
-ignore = D100,D101,D102,D103,D104,D105,D200,D202,D203,D204,D205,D207,D208,D211,D301,D400,D401
+ignore = D100,D101,D102,D103,D104,D105,D200,D202,D203,D204,D205,D207,D208,D211,D301,D400
show-source = True
exclude = .venv,.tox,dist,doc,*egg,build,*openstack/common*