Rename deprecated context params

The user, tenant and parameters without _id are deprecated as properties
on the object however have never been deprecated as the argument that is
passed.

This should be a fairly easy transition from a context perspective so
simply use the debtcollector function to rename them in place.

Change-Id: Id6ae5a1c869b8e4279d0100bdb6dbf6790dd9b83
This commit is contained in:
Jamie Lennox 2017-08-28 11:43:55 +10:00
parent 8c7a18fc55
commit d78cf592e1
2 changed files with 66 additions and 43 deletions

View File

@ -27,12 +27,14 @@ or logging context.
"""
import collections
import functools
import itertools
import threading
import uuid
import warnings
import debtcollector
from debtcollector import renames
_request_store = threading.local()
@ -42,13 +44,13 @@ _request_store = threading.local()
_ENVIRON_HEADERS = {
'auth_token': ['HTTP_X_AUTH_TOKEN',
'HTTP_X_STORAGE_TOKEN'],
'user': ['HTTP_X_USER_ID',
'HTTP_X_USER'],
'tenant': ['HTTP_X_PROJECT_ID',
'HTTP_X_TENANT_ID',
'HTTP_X_TENANT'],
'user_domain': ['HTTP_X_USER_DOMAIN_ID'],
'project_domain': ['HTTP_X_PROJECT_DOMAIN_ID'],
'user_id': ['HTTP_X_USER_ID',
'HTTP_X_USER'],
'project_id': ['HTTP_X_PROJECT_ID',
'HTTP_X_TENANT_ID',
'HTTP_X_TENANT'],
'user_domain_id': ['HTTP_X_USER_DOMAIN_ID'],
'project_domain_id': ['HTTP_X_PROJECT_DOMAIN_ID'],
'user_name': ['HTTP_X_USER_NAME'],
'project_name': ['HTTP_X_PROJECT_NAME',
'HTTP_X_TENANT_NAME'],
@ -163,6 +165,12 @@ def _moved_property(new_name, old_name=None, target=None):
return property(getter, setter, deleter)
_renamed_kwarg = functools.partial(renames.renamed_kwarg,
version='2.18',
removal_version='3.0',
replace=True)
class RequestContext(object):
"""Helper class to represent useful information about a request context.
@ -173,13 +181,18 @@ class RequestContext(object):
user_idt_format = u'{user} {tenant} {domain} {user_domain} {p_domain}'
@_renamed_kwarg('user', 'user_id')
@_renamed_kwarg('tenant', 'project_id')
@_renamed_kwarg('domain', 'domain_id')
@_renamed_kwarg('user_domain', 'user_domain_id')
@_renamed_kwarg('project_domain', 'project_domain_id')
def __init__(self,
auth_token=None,
user=None,
tenant=None,
domain=None,
user_domain=None,
project_domain=None,
user_id=None,
project_id=None,
domain_id=None,
user_domain_id=None,
project_domain_id=None,
is_admin=False,
read_only=False,
show_deleted=False,
@ -214,11 +227,11 @@ class RequestContext(object):
:type is_admin_project: bool
"""
# setting to private variables to avoid triggering subclass properties
self._user_id = user
self._project_id = tenant
self._domain_id = domain
self._user_domain_id = user_domain
self._project_domain_id = project_domain
self._user_id = user_id
self._project_id = project_id
self._domain_id = domain_id
self._user_domain_id = user_domain_id
self._project_domain_id = project_domain_id
self.auth_token = auth_token
self.user_name = user_name
@ -349,14 +362,19 @@ class RequestContext(object):
return self.global_request_id or self.request_id
@classmethod
@_renamed_kwarg('user', 'user_id')
@_renamed_kwarg('tenant', 'project_id')
@_renamed_kwarg('domain', 'domain_id')
@_renamed_kwarg('user_domain', 'user_domain_id')
@_renamed_kwarg('project_domain', 'project_domain_id')
def from_dict(cls, values, **kwargs):
"""Construct a context object from a provided dictionary."""
kwargs.setdefault('auth_token', values.get('auth_token'))
kwargs.setdefault('user', values.get('user'))
kwargs.setdefault('tenant', values.get('tenant'))
kwargs.setdefault('domain', values.get('domain'))
kwargs.setdefault('user_domain', values.get('user_domain'))
kwargs.setdefault('project_domain', values.get('project_domain'))
kwargs.setdefault('user_id', values.get('user'))
kwargs.setdefault('project_id', values.get('tenant'))
kwargs.setdefault('domain_id', values.get('domain'))
kwargs.setdefault('user_domain_id', values.get('user_domain'))
kwargs.setdefault('project_domain_id', values.get('project_domain'))
kwargs.setdefault('is_admin', values.get('is_admin', False))
kwargs.setdefault('read_only', values.get('read_only', False))
kwargs.setdefault('show_deleted', values.get('show_deleted', False))
@ -375,6 +393,11 @@ class RequestContext(object):
return cls(**kwargs)
@classmethod
@_renamed_kwarg('user', 'user_id')
@_renamed_kwarg('tenant', 'project_id')
@_renamed_kwarg('domain', 'domain_id')
@_renamed_kwarg('user_domain', 'user_domain_id')
@_renamed_kwarg('project_domain', 'project_domain_id')
def from_environ(cls, environ, **kwargs):
"""Load a context object from a request environment.
@ -421,7 +444,7 @@ class RequestContext(object):
def get_admin_context(show_deleted=False):
"""Create an administrator context."""
context = RequestContext(None,
tenant=None,
project_id=None,
is_admin=True,
show_deleted=show_deleted,
overwrite=False)

View File

@ -592,33 +592,33 @@ class ContextTest(test_base.BaseTestCase):
self.assertIn(key, str(w[0].message))
def test_deprecated_args(self):
user = uuid.uuid4().hex
tenant = uuid.uuid4().hex
domain = uuid.uuid4().hex
user_domain = uuid.uuid4().hex
project_domain = uuid.uuid4().hex
user_id = uuid.uuid4().hex
project_id = uuid.uuid4().hex
domain_id = uuid.uuid4().hex
user_domain_id = uuid.uuid4().hex
project_domain_id = uuid.uuid4().hex
ctx = context.RequestContext(user=user,
tenant=tenant,
domain=domain,
user_domain=user_domain,
project_domain=project_domain)
ctx = context.RequestContext(user_id=user_id,
project_id=project_id,
domain_id=domain_id,
user_domain_id=user_domain_id,
project_domain_id=project_domain_id)
self.assertEqual(0, len(self.warnings))
self.assertEqual(user, ctx.user_id)
self.assertEqual(tenant, ctx.project_id)
self.assertEqual(domain, ctx.domain_id)
self.assertEqual(user_domain, ctx.user_domain_id)
self.assertEqual(project_domain, ctx.project_domain_id)
self.assertEqual(user_id, ctx.user_id)
self.assertEqual(project_id, ctx.project_id)
self.assertEqual(domain_id, ctx.domain_id)
self.assertEqual(user_domain_id, ctx.user_domain_id)
self.assertEqual(project_domain_id, ctx.project_domain_id)
self.assertEqual(0, len(self.warnings))
self.assertEqual(user, ctx.user)
self.assertEqual(user_id, ctx.user)
self.assertEqual(1, len(self.warnings))
self.assertEqual(tenant, ctx.tenant)
self.assertEqual(project_id, ctx.tenant)
self.assertEqual(2, len(self.warnings))
self.assertEqual(domain, ctx.domain)
self.assertEqual(domain_id, ctx.domain)
self.assertEqual(3, len(self.warnings))
self.assertEqual(user_domain, ctx.user_domain)
self.assertEqual(user_domain_id, ctx.user_domain)
self.assertEqual(4, len(self.warnings))
self.assertEqual(project_domain, ctx.project_domain)
self.assertEqual(project_domain_id, ctx.project_domain)
self.assertEqual(5, len(self.warnings))