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

View File

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