Add tenant_id back to objects for backwards compat

To be 100% backwards compatible with neutron-lbaas, we need to continue
to return tenant_id in addition to project_id, even though it has been
deprecated and was actually removed previously from Octavia.

Adding it this way is much cleaner than adding it to every object and
will allow us to remove it very easily in the future.

Change-Id: I371a5bd51fc9acc4f6ef1e2b3b2fae9d4babd975
This commit is contained in:
Adam Harwell 2018-05-21 15:49:57 -07:00
parent 3dfb6c6efe
commit d786bf4f6d
6 changed files with 74 additions and 7 deletions

View File

@ -74,6 +74,37 @@ class URLPathType(wtypes.UserType):
return value
class BaseMeta(wtypes.BaseMeta):
def __new__(mcs, name, bases, dct):
def get_tenant_id(self):
tenant_id = getattr(self, '_tenant_id', wtypes.Unset)
# If tenant_id was explicitly set to Unset, return that
if tenant_id is wtypes.Unset and self._unset_tenant:
return tenant_id
# Otherwise, assume we can return project_id
return self.project_id
def set_tenant_id(self, tenant_id):
self._tenant_id = tenant_id
if tenant_id is wtypes.Unset:
# Record that tenant_id was explicitly Unset
self._unset_tenant = True
else:
# Reset 'unset' state, and update project_id as well
self._unset_tenant = False
self.project_id = tenant_id
if 'project_id' in dct and 'tenant_id' not in dct:
dct['tenant_id'] = wtypes.wsproperty(
wtypes.StringType(max_length=36),
get_tenant_id, set_tenant_id)
# This will let us know if tenant_id was explicitly set to Unset
dct['_unset_tenant'] = False
return super(BaseMeta, mcs).__new__(mcs, name, bases, dct)
@six.add_metaclass(BaseMeta)
class BaseType(wtypes.Base):
@classmethod
def _full_response(cls):

View File

@ -17,6 +17,7 @@ import logging
from oslo_config import cfg
from pecan import rest
from stevedore import driver as stevedore_driver
from wsme import types as wtypes
from octavia.common import constants
from octavia.common import data_models
@ -203,7 +204,7 @@ class BaseController(rest.RestController):
members = self._get_attrs(obj)
for member in members:
if member not in fields:
delattr(object_list[index], member)
setattr(obj, member, wtypes.Unset)
return object_list
@staticmethod

View File

@ -114,6 +114,8 @@ class TestListener(base.BaseAPITest):
self.assertIn(sni, sni_ex)
self.assertIsNotNone(listener_api.pop('created_at'))
self.assertIsNone(listener_api.pop('updated_at'))
self.assertEqual(listener_api['project_id'],
listener_api.pop('tenant_id'))
lb_listener['project_id'] = self.project_id
self.assertEqual(lb_listener, listener_api)
self.assert_correct_lb_status(self.lb.get('id'),
@ -198,6 +200,8 @@ class TestListener(base.BaseAPITest):
lb_listener['id'] = listener_api.get('id')
self.assertIsNotNone(listener_api.pop('created_at'))
self.assertIsNone(listener_api.pop('updated_at'))
self.assertEqual(listener_api['project_id'],
listener_api.pop('tenant_id'))
self.assertEqual(lb_listener, listener_api)
self.assert_correct_lb_status(self.lb.get('id'),
constants.PENDING_UPDATE,

View File

@ -457,6 +457,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
observed_graph_copy = copy.deepcopy(observed_graph)
del observed_graph_copy['created_at']
del observed_graph_copy['updated_at']
self.assertEqual(observed_graph_copy['project_id'],
observed_graph_copy.pop('tenant_id'))
obs_lb_id = observed_graph_copy.pop('id')
self.assertTrue(uuidutils.is_uuid_like(obs_lb_id))
@ -466,6 +468,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
for observed_listener in observed_listeners:
del observed_listener['created_at']
del observed_listener['updated_at']
self.assertEqual(observed_listener['project_id'],
observed_listener.pop('tenant_id'))
self.assertTrue(uuidutils.is_uuid_like(
observed_listener.pop('id')))
@ -476,15 +480,19 @@ class TestLoadBalancerGraph(base.BaseAPITest):
default_pool.pop('id')
default_pool.pop('created_at')
default_pool.pop('updated_at')
hm = default_pool.get('healthmonitor')
self.assertEqual(default_pool['project_id'],
default_pool.pop('tenant_id'))
hm = default_pool.get('health_monitor')
if hm:
self.assertTrue(hm.get('id'))
hm.pop('id')
self.assertEqual(hm['project_id'],
hm.pop('tenant_id'))
for member in default_pool.get('members', []):
self.assertTrue(member.get('id'))
member.pop('id')
member.pop('created_at')
member.pop('updated_at')
self.assertEqual(member['project_id'],
member.pop('tenant_id'))
if observed_listener.get('sni_containers'):
observed_listener['sni_containers'].sort()
o_l7policies = observed_listener.get('l7policies')
@ -496,6 +504,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
r_pool.pop('id')
r_pool.pop('created_at')
r_pool.pop('updated_at')
self.assertEqual(r_pool['project_id'],
r_pool.pop('tenant_id'))
self.assertTrue(o_l7policy.get('redirect_pool_id'))
o_l7policy.pop('redirect_pool_id')
if r_pool.get('members'):
@ -504,6 +514,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
r_member.pop('id')
r_member.pop('created_at')
r_member.pop('updated_at')
self.assertEqual(r_member['project_id'],
r_member.pop('tenant_id'))
self.assertTrue(o_l7policy.get('id'))
o_l7policy.pop('id')
l7rules = o_l7policy.get('l7rules')

View File

@ -72,6 +72,17 @@ class TestLoadBalancer(base.BaseAPITest):
self._assert_request_matches_response(lb_json, api_lb)
return api_lb
def test_create_using_tenant_id(self):
lb_json = {'name': 'test1',
'vip_subnet_id': uuidutils.generate_uuid(),
'tenant_id': self.project_id
}
body = self._build_body(lb_json)
response = self.post(self.LBS_PATH, body)
api_lb = response.json.get(self.root_tag)
self._assert_request_matches_response(lb_json, api_lb)
return api_lb
def test_create_without_vip(self):
lb_json = {'name': 'test1',
'project_id': self.project_id}
@ -1865,6 +1876,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
observed_graph_copy = copy.deepcopy(observed_graph)
del observed_graph_copy['created_at']
del observed_graph_copy['updated_at']
self.assertEqual(observed_graph_copy['project_id'],
observed_graph_copy.pop('tenant_id'))
obs_lb_id = observed_graph_copy.pop('id')
self.assertTrue(uuidutils.is_uuid_like(obs_lb_id))
@ -1881,6 +1894,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
for observed_listener in observed_listeners:
del observed_listener['created_at']
del observed_listener['updated_at']
self.assertEqual(observed_listener['project_id'],
observed_listener.pop('tenant_id'))
self.assertTrue(uuidutils.is_uuid_like(
observed_listener.pop('id')))
@ -1895,7 +1910,7 @@ class TestLoadBalancerGraph(base.BaseAPITest):
default_pool.pop('id')
default_pool.pop('created_at')
default_pool.pop('updated_at')
hm = default_pool.get('healthmonitor')
hm = default_pool.get('health_monitor')
if hm:
self.assertTrue(hm.get('id'))
hm.pop('id')
@ -1911,6 +1926,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
for o_l7policy in o_l7policies:
o_l7policy.pop('created_at')
o_l7policy.pop('updated_at')
self.assertEqual(o_l7policy['project_id'],
o_l7policy.pop('tenant_id'))
if o_l7policy.get('redirect_pool_id'):
r_pool_id = o_l7policy.pop('redirect_pool_id')
self.assertTrue(uuidutils.is_uuid_like(r_pool_id))
@ -1922,6 +1939,8 @@ class TestLoadBalancerGraph(base.BaseAPITest):
for l7rule in l7rules:
l7rule.pop('created_at')
l7rule.pop('updated_at')
self.assertEqual(l7rule['project_id'],
l7rule.pop('tenant_id'))
self.assertTrue(l7rule.pop('id'))
self.assertIn(observed_listener, expected_listeners)

View File

@ -95,8 +95,8 @@ class TestQuotas(base.BaseAPITest):
response = self.get(self.QUOTAS_PATH)
quota_list = response.json
quota1['project_id'] = project_id1
quota2['project_id'] = project_id2
quota1['project_id'] = quota1['tenant_id'] = project_id1
quota2['project_id'] = quota2['tenant_id'] = project_id2
expected = {'quotas': [quota1, quota2], 'quotas_links': []}
self.assertEqual(expected, quota_list)