Remove use of positional decorator

The positional decorator results in poorly maintainable code in
a misguided effort to emulate python3's key-word-arg only notation
and functionality. This patch removes keystoneclient's dependance
on the positional decorator.

Change-Id: I9e691cc8b0c04992f4a8dabd67e1b413d3220d23
This commit is contained in:
Morgan Fainberg 2017-08-07 13:13:31 -07:00
parent 5d0c29fc91
commit 4a43aa02b8
32 changed files with 2 additions and 116 deletions

@ -24,8 +24,6 @@ raw data specified in version discovery responses.
import logging
import re
from positional import positional
from keystoneclient import exceptions
from keystoneclient.i18n import _
@ -33,7 +31,6 @@ from keystoneclient.i18n import _
_LOGGER = logging.getLogger(__name__)
@positional()
def get_version_data(session, url, authenticated=None):
"""Retrieve raw version data from a url."""
headers = {'Accept': 'application/json'}
@ -141,7 +138,6 @@ class Discover(object):
DEPRECATED_STATUSES = ('deprecated',)
EXPERIMENTAL_STATUSES = ('experimental',)
@positional()
def __init__(self, session, url, authenticated=None):
self._data = get_version_data(session, url,
authenticated=authenticated)

@ -13,7 +13,6 @@
import warnings
from oslo_serialization import jsonutils
from positional import positional
class Adapter(object):
@ -46,7 +45,6 @@ class Adapter(object):
:type logger: logging.Logger
"""
@positional()
def __init__(self, session, service_type=None, service_name=None,
interface=None, region_name=None, endpoint_override=None,
version=None, auth=None, user_agent=None,

@ -14,7 +14,6 @@ import argparse
import os
from debtcollector import removals
from positional import positional
from keystoneclient.auth import base
@ -24,7 +23,6 @@ from keystoneclient.auth import base
version='2.1.0',
removal_version='3.0.0'
)
@positional()
def register_argparse_arguments(parser, argv, default=None):
"""Register CLI options needed to create a plugin.

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient.auth.identity import base
@ -32,7 +30,6 @@ class AccessInfoPlugin(base.BaseIdentityPlugin):
if using the AUTH_INTERFACE with get_endpoint. (optional)
"""
@positional()
def __init__(self, auth_ref, auth_url=None):
super(AccessInfoPlugin, self).__init__(auth_url=auth_url,
reauthenticate=False)

@ -16,7 +16,6 @@ import threading
import warnings
from oslo_config import cfg
from positional import positional
import six
from keystoneclient import _discover
@ -366,7 +365,6 @@ class BaseIdentityPlugin(base.BaseAuthPlugin):
def get_project_id(self, session, **kwargs):
return self.get_access(session).project_id
@positional()
def get_discovery(self, session, url, authenticated=None):
"""Return the discovery object for a URL.

@ -11,7 +11,6 @@
# under the License.
from oslo_config import cfg
from positional import positional
from keystoneclient.auth.identity.generic import password
from keystoneclient import exceptions as exc
@ -25,7 +24,6 @@ class DefaultCLI(password.Password):
as well as allowing users to override with a custom token and endpoint.
"""
@positional()
def __init__(self, endpoint=None, token=None, **kwargs):
super(DefaultCLI, self).__init__(**kwargs)

@ -11,7 +11,6 @@
# under the License.
from oslo_config import cfg
from positional import positional
from keystoneclient import _discover
from keystoneclient.auth.identity.generic import base
@ -42,7 +41,6 @@ class Password(base.BaseGenericPlugin):
"""
@positional()
def __init__(self, auth_url, username=None, user_id=None, password=None,
user_domain_id=None, user_domain_name=None, **kwargs):
super(Password, self).__init__(auth_url=auth_url, **kwargs)

@ -14,7 +14,6 @@ import abc
import logging
from oslo_config import cfg
from positional import positional
import six
from keystoneclient import access
@ -49,7 +48,6 @@ class Auth(base.BaseIdentityPlugin):
return options
@positional()
def __init__(self, auth_url,
trust_id=None,
tenant_id=None,
@ -128,7 +126,6 @@ class Password(Auth):
:raises TypeError: if a user_id or username is not provided.
"""
@positional(4)
def __init__(self, auth_url, username=_NOT_PASSED, password=None,
user_id=_NOT_PASSED, **kwargs):
super(Password, self).__init__(auth_url, **kwargs)

@ -15,7 +15,6 @@ import json
import logging
from oslo_config import cfg
from positional import positional
import six
from keystoneclient import access
@ -47,7 +46,6 @@ class BaseAuth(base.BaseIdentityPlugin):
token. (optional) default True.
"""
@positional()
def __init__(self, auth_url,
trust_id=None,
domain_id=None,

@ -11,7 +11,6 @@
# under the License.
from oslo_config import cfg
from positional import positional
from keystoneclient import access
from keystoneclient.auth.identity.v3 import federated
@ -42,7 +41,6 @@ class OidcPassword(federated.FederatedBaseAuth):
])
return options
@positional(4)
def __init__(self, auth_url, identity_provider, protocol,
username, password, client_id, client_secret,
access_token_endpoint, scope='profile',

@ -14,7 +14,6 @@ import warnings
from debtcollector import removals
from keystoneauth1 import plugin
from positional import positional
from keystoneclient import _discover
from keystoneclient import exceptions
@ -146,7 +145,6 @@ class Discover(_discover.Discover):
"""
@positional(2)
def __init__(self, session=None, authenticated=None, **kwargs):
if not session:
warnings.warn(

@ -25,7 +25,6 @@ from debtcollector import renames
from keystoneauth1 import adapter
from oslo_serialization import jsonutils
import pkg_resources
from positional import positional
import requests
try:
@ -241,7 +240,6 @@ class HTTPClient(baseclient.Client, base.BaseAuthPlugin):
removal_version='2.0.0')
@renames.renamed_kwarg('tenant_id', 'project_id', version='1.7.0',
removal_version='2.0.0')
@positional(enforcement=positional.WARN)
def __init__(self, username=None, tenant_id=None, tenant_name=None,
password=None, auth_url=None, region_name=None, endpoint=None,
token=None, auth_ref=None, use_keyring=False,
@ -483,7 +481,6 @@ class HTTPClient(baseclient.Client, base.BaseAuthPlugin):
return self.project_name
@positional(enforcement=positional.WARN)
def authenticate(self, username=None, password=None, tenant_name=None,
tenant_id=None, auth_url=None, token=None,
user_id=None, domain_name=None, domain_id=None,
@ -693,7 +690,6 @@ class HTTPClient(baseclient.Client, base.BaseAuthPlugin):
# permanently setting _endpoint would better match that behaviour.
self._endpoint = value
@positional(enforcement=positional.WARN)
def get_raw_token_from_identity_service(self, auth_url, username=None,
password=None, tenant_name=None,
tenant_id=None, token=None,

@ -19,7 +19,6 @@
import abc
import warnings
from positional import positional
import six
from keystoneclient import exceptions
@ -209,7 +208,6 @@ class ServiceCatalog(object):
return endpoints
@abc.abstractmethod
@positional(enforcement=positional.WARN)
def get_urls(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='publicURL',
region_name=None, service_name=None):
@ -233,7 +231,6 @@ class ServiceCatalog(object):
"""
raise NotImplementedError() # pragma: no cover
@positional(3, enforcement=positional.WARN)
def url_for(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='publicURL',
region_name=None, service_name=None):
@ -348,7 +345,6 @@ class ServiceCatalogV2(ServiceCatalog):
pass
return token
@positional(enforcement=positional.WARN)
def get_urls(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='publicURL',
region_name=None, service_name=None):
@ -415,7 +411,6 @@ class ServiceCatalogV3(ServiceCatalog):
pass
return token
@positional(enforcement=positional.WARN)
def get_urls(self, attr=None, filter_value=None,
service_type='identity', endpoint_type='public',
region_name=None, service_name=None):

@ -25,7 +25,6 @@ from oslo_serialization import jsonutils
from oslo_utils import encodeutils
from oslo_utils import importutils
from oslo_utils import strutils
from positional import positional
import requests
import six
from six.moves import urllib
@ -134,7 +133,6 @@ class Session(object):
"""This property is deprecated as of the 1.7.0 release and may be removed
in the 2.0.0 release."""
@positional(2, enforcement=positional.WARN)
def __init__(self, auth=None, session=None, original_ip=None, verify=True,
cert=None, timeout=None, user_agent=None,
redirect=_DEFAULT_REDIRECT_LIMIT):
@ -177,7 +175,6 @@ class Session(object):
return (header[0], '{SHA1}%s' % token_hash)
return header
@positional()
def _http_log_request(self, url, method=None, data=None,
headers=None, logger=_logger):
if not logger.isEnabledFor(logging.DEBUG):
@ -256,7 +253,6 @@ class Session(object):
logger.debug(' '.join(string_parts))
# NOTE(artmr): parameter 'original_ip' value is never used
@positional(enforcement=positional.WARN)
def request(self, url, method, json=None, original_ip=None,
user_agent=None, redirect=None, authenticated=None,
endpoint_filter=None, auth=None, requests_auth=None,
@ -806,7 +802,7 @@ class Session(object):
auth = self._auth_required(auth, msg)
return auth.get_project_id(self)
@positional.classmethod()
@classmethod
def get_conf_options(cls, deprecated_opts=None):
"""Get oslo_config options that are needed for a :py:class:`.Session`.
@ -855,7 +851,7 @@ class Session(object):
help='Timeout value for http requests'),
]
@positional.classmethod()
@classmethod
def register_conf_options(cls, conf, group, deprecated_opts=None):
"""Register the oslo_config options that are needed for a session.

@ -64,11 +64,6 @@ class TokenTests(utils.ClientTestCase, testresources.ResourcedTestCase):
self.assertQueryStringIs('audit_id_only')
self.assertEqual(sample_revoked_response, resp)
def test_get_revoked_audit_id_only_positional_exc(self):
# When get_revoked(True) an exception is raised because this must be
# called with named parameter.
self.assertRaises(TypeError, self.client.tokens.get_revoked, True)
def test_validate_token_with_token_id(self):
# Can validate a token passing a string token ID.
token_id = uuid.uuid4().hex

@ -16,9 +16,6 @@ import sys
from keystoneauth1 import exceptions as ksa_exceptions
from oslo_utils import timeutils
# NOTE(stevemar): do not remove positional. We need this to stay for a while
# since versions of auth_token require it here.
from positional import positional # noqa
import six
from keystoneclient import exceptions as ksc_exceptions

@ -12,7 +12,6 @@
from keystoneauth1 import exceptions
from keystoneauth1 import plugin
from positional import positional
from keystoneclient import access
from keystoneclient import base
@ -40,7 +39,6 @@ class Token(base.Resource):
class TokenManager(base.Manager):
resource_class = Token
@positional(enforcement=positional.WARN)
def authenticate(self, username=None, tenant_id=None, tenant_name=None,
password=None, token=None, return_raw=False):
if token:

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -40,7 +38,6 @@ class IdentityProviderManager(base.CrudManager):
return self._update(url, body=body, response_key=self.key,
method='PUT')
@positional.method(0)
def create(self, id, **kwargs):
"""Create Identity Provider object.

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -41,7 +39,6 @@ class MappingManager(base.CrudManager):
response_key=self.key,
method='PUT')
@positional.method(0)
def create(self, mapping_id, **kwargs):
"""Create federation mapping.

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -57,7 +55,6 @@ class ProtocolManager(base.CrudManager):
response_key=self.key,
method='PUT')
@positional.method(3)
def create(self, protocol_id, identity_provider, mapping, **kwargs):
"""Create federation protocol object and tie to the Identity Provider.

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -42,7 +40,6 @@ class ServiceProviderManager(base.CrudManager):
return self._update(url, body=body, response_key=self.key,
method='PUT')
@positional.method(0)
def create(self, id, **kwargs):
"""Create Service Provider object.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -41,7 +39,6 @@ class CredentialManager(base.CrudManager):
collection_key = 'credentials'
key = 'credential'
@positional(1, enforcement=positional.WARN)
def create(self, user, type, blob, project=None, **kwargs):
"""Create a credential.
@ -95,7 +92,6 @@ class CredentialManager(base.CrudManager):
"""
return super(CredentialManager, self).list(**kwargs)
@positional(2, enforcement=positional.WARN)
def update(self, credential, user, type=None, blob=None, project=None,
**kwargs):
"""Update a credential.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -40,7 +38,6 @@ class DomainManager(base.CrudManager):
collection_key = 'domains'
key = 'domain'
@positional(1, enforcement=positional.WARN)
def create(self, name, description=None, enabled=True, **kwargs):
"""Create a domain.
@ -89,7 +86,6 @@ class DomainManager(base.CrudManager):
kwargs['enabled'] = 0
return super(DomainManager, self).list(**kwargs)
@positional(enforcement=positional.WARN)
def update(self, domain, name=None,
description=None, enabled=None, **kwargs):
"""Update a domain.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
from keystoneclient import exceptions
from keystoneclient.i18n import _
@ -54,7 +52,6 @@ class EndpointManager(base.CrudManager):
msg %= ', '.join(VALID_INTERFACES)
raise exceptions.ValidationError(msg)
@positional(1, enforcement=positional.WARN)
def create(self, service, url, interface=None, region=None, enabled=True,
**kwargs):
"""Create an endpoint.
@ -97,7 +94,6 @@ class EndpointManager(base.CrudManager):
return super(EndpointManager, self).get(
endpoint_id=base.getid(endpoint))
@positional(enforcement=positional.WARN)
def list(self, service=None, interface=None, region=None, enabled=None,
region_id=None, **kwargs):
"""List endpoints.
@ -128,7 +124,6 @@ class EndpointManager(base.CrudManager):
enabled=enabled,
**kwargs)
@positional(enforcement=positional.WARN)
def update(self, endpoint, service=None, url=None, interface=None,
region=None, enabled=None, **kwargs):
"""Update an endpoint.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -29,7 +27,6 @@ class Group(base.Resource):
"""
@positional(enforcement=positional.WARN)
def update(self, name=None, description=None):
kwargs = {
'name': name if name is not None else self.name,
@ -54,7 +51,6 @@ class GroupManager(base.CrudManager):
collection_key = 'groups'
key = 'group'
@positional(1, enforcement=positional.WARN)
def create(self, name, domain=None, description=None, **kwargs):
"""Create a group.
@ -75,7 +71,6 @@ class GroupManager(base.CrudManager):
description=description,
**kwargs)
@positional(enforcement=positional.WARN)
def list(self, user=None, domain=None, **kwargs):
"""List groups.
@ -111,7 +106,6 @@ class GroupManager(base.CrudManager):
return super(GroupManager, self).get(
group_id=base.getid(group))
@positional(enforcement=positional.WARN)
def update(self, group, name=None, description=None, **kwargs):
"""Update a group.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -29,7 +27,6 @@ class Policy(base.Resource):
"""
@positional(enforcement=positional.WARN)
def update(self, blob=None, type=None):
kwargs = {
'blob': blob if blob is not None else self.blob,
@ -52,7 +49,6 @@ class PolicyManager(base.CrudManager):
collection_key = 'policies'
key = 'policy'
@positional(1, enforcement=positional.WARN)
def create(self, blob, type='application/json', **kwargs):
"""Create a policy.
@ -95,7 +91,6 @@ class PolicyManager(base.CrudManager):
"""
return super(PolicyManager, self).list(**kwargs)
@positional(enforcement=positional.WARN)
def update(self, policy, blob=None, type=None, **kwargs):
"""Update a policy.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
from keystoneclient import exceptions
from keystoneclient.i18n import _
@ -37,7 +35,6 @@ class Project(base.Resource):
"""
@positional(enforcement=positional.WARN)
def update(self, name=None, description=None, enabled=None):
kwargs = {
'name': name if name is not None else self.name,
@ -63,7 +60,6 @@ class ProjectManager(base.CrudManager):
collection_key = 'projects'
key = 'project'
@positional(3, enforcement=positional.WARN)
def create(self, name, domain, description=None,
enabled=True, parent=None, **kwargs):
"""Create a project.
@ -96,7 +92,6 @@ class ProjectManager(base.CrudManager):
enabled=enabled,
**kwargs)
@positional(enforcement=positional.WARN)
def list(self, domain=None, user=None, **kwargs):
"""List projects.
@ -132,7 +127,6 @@ class ProjectManager(base.CrudManager):
'parameters, not both')
raise exceptions.ValidationError(msg)
@positional()
def get(self, project, subtree_as_list=False, parents_as_list=False,
subtree_as_ids=False, parents_as_ids=False):
"""Retrieve a project.
@ -182,7 +176,6 @@ class ProjectManager(base.CrudManager):
url = self.build_url(dict_args_in_out=dict_args)
return self._get(url + query, self.key)
@positional(enforcement=positional.WARN)
def update(self, project, name=None, domain=None, description=None,
enabled=None, **kwargs):
"""Update a project.

@ -15,7 +15,6 @@
# under the License.
from debtcollector import removals
from positional import positional
from keystoneclient import base
from keystoneclient import exceptions
@ -96,7 +95,6 @@ class RoleManager(base.CrudManager):
msg = _('Must specify either a user or group')
raise exceptions.ValidationError(msg)
@positional(1, enforcement=positional.WARN)
def create(self, name, domain=None, **kwargs):
"""Create a role.
@ -132,7 +130,6 @@ class RoleManager(base.CrudManager):
"""
return super(RoleManager, self).get(role_id=base.getid(role))
@positional(enforcement=positional.WARN)
def list(self, user=None, group=None, domain=None,
project=None, os_inherit_extension_inherited=False, **kwargs):
"""List roles and role grants.
@ -178,7 +175,6 @@ class RoleManager(base.CrudManager):
return super(RoleManager, self).list(**kwargs)
@positional(enforcement=positional.WARN)
def update(self, role, name=None, **kwargs):
"""Update a role.
@ -212,7 +208,6 @@ class RoleManager(base.CrudManager):
return super(RoleManager, self).delete(
role_id=base.getid(role))
@positional(enforcement=positional.WARN)
def grant(self, role, user=None, group=None, domain=None, project=None,
os_inherit_extension_inherited=False, **kwargs):
"""Grant a role to a user or group on a domain or project.
@ -259,7 +254,6 @@ class RoleManager(base.CrudManager):
role_id=base.getid(role),
**kwargs)
@positional(enforcement=positional.WARN)
def check(self, role, user=None, group=None, domain=None, project=None,
os_inherit_extension_inherited=False, **kwargs):
"""Check if a user or group has a role on a domain or project.
@ -310,7 +304,6 @@ class RoleManager(base.CrudManager):
os_inherit_extension_inherited=os_inherit_extension_inherited,
**kwargs)
@positional(enforcement=positional.WARN)
def revoke(self, role, user=None, group=None, domain=None, project=None,
os_inherit_extension_inherited=False, **kwargs):
"""Revoke a role from a user or group on a domain or project.

@ -14,8 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import base
@ -41,7 +39,6 @@ class ServiceManager(base.CrudManager):
collection_key = 'services'
key = 'service'
@positional(1, enforcement=positional.WARN)
def create(self, name, type=None,
enabled=True, description=None, **kwargs):
"""Create a service.
@ -78,7 +75,6 @@ class ServiceManager(base.CrudManager):
return super(ServiceManager, self).get(
service_id=base.getid(service))
@positional(enforcement=positional.WARN)
def list(self, name=None, type=None, **kwargs):
"""List services.
@ -96,7 +92,6 @@ class ServiceManager(base.CrudManager):
type=type_arg,
**kwargs)
@positional(enforcement=positional.WARN)
def update(self, service, name=None, type=None, enabled=None,
description=None, **kwargs):
"""Update a service.

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from positional import positional
from keystoneclient import access
from keystoneclient import base
@ -40,7 +38,6 @@ class TokenManager(object):
headers = {'X-Subject-Token': token_id}
return self._client.delete('/auth/tokens', headers=headers)
@positional.method(0)
def get_revoked(self, audit_id_only=False):
"""Get revoked tokens list.
@ -60,7 +57,6 @@ class TokenManager(object):
resp, body = self._client.get(path)
return body
@positional.method(1)
def get_token_data(self, token, include_catalog=True, allow_expired=False):
"""Fetch the data about a token from the identity server.
@ -89,7 +85,6 @@ class TokenManager(object):
resp, body = self._client.get(url, headers=headers)
return body
@positional.method(1)
def validate(self, token, include_catalog=True, allow_expired=False):
"""Validate a token.

@ -15,7 +15,6 @@
# under the License.
from debtcollector import renames
from positional import positional
from keystoneclient import base
from keystoneclient import exceptions
@ -47,7 +46,6 @@ class UserManager(base.CrudManager):
@renames.renamed_kwarg('project', 'default_project', version='1.7.0',
removal_version='2.0.0')
@positional(1, enforcement=positional.WARN)
def create(self, name, domain=None, project=None, password=None,
email=None, description=None, enabled=True,
default_project=None, **kwargs):
@ -96,7 +94,6 @@ class UserManager(base.CrudManager):
@renames.renamed_kwarg('project', 'default_project', version='1.7.0',
removal_version='2.0.0')
@positional(enforcement=positional.WARN)
def list(self, project=None, domain=None, group=None, default_project=None,
**kwargs):
"""List users.
@ -153,7 +150,6 @@ class UserManager(base.CrudManager):
@renames.renamed_kwarg('project', 'default_project', version='1.7.0',
removal_version='2.0.0')
@positional(enforcement=positional.WARN)
def update(self, user, name=None, domain=None, project=None, password=None,
email=None, description=None, enabled=None,
default_project=None, **kwargs):

@ -10,7 +10,6 @@ oslo.config!=4.3.0,!=4.4.0,>=4.0.0 # Apache-2.0
oslo.i18n!=3.15.2,>=2.1.0 # Apache-2.0
oslo.serialization!=2.19.1,>=1.10.0 # Apache-2.0
oslo.utils>=3.20.0 # Apache-2.0
positional>=1.1.1 # Apache-2.0
requests>=2.14.2 # Apache-2.0
six>=1.9.0 # MIT
stevedore>=1.20.0 # Apache-2.0