Use different context for each API request in unit tests
test_router_add_interface_subnet_with_port_from_other_tenant in neutron.tests.unit.test_l3_plugin.L3NatTestCaseBase was mocking neutron.context.Context thus performing multiple API requests with the same context instance. As a context instance also has a DB session attribute, this might cause unexpected side effects, especially for plugins which process request asynchronously. The plugin neutron.plugins.nicira.NeutronServicePlugin was being affected. This patch ensures each request has a different context object without changing the unit test semantics. It also refactors slightly test_edge_router.py in the nicira unit test package to avoid executing twice the same unit tests. Change-Id: I4895faa00ebd915eb9e259930db2d004a9e78a86 Closes-Bug: #1280035
This commit is contained in:
parent
9c0fc8e981
commit
8cf94ebe0d
@ -63,19 +63,6 @@ class ServiceRouterTestExtensionManager(object):
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
class NvpRouterTestCase(test_nicira_plugin.TestNiciraL3NatTestCase):
|
|
||||||
|
|
||||||
def setUp(self, plugin=None, ext_mgr=None, service_plugins=None):
|
|
||||||
plugin = plugin or SERVICE_PLUGIN_NAME
|
|
||||||
# Disable the proxying in the tests but functionality will
|
|
||||||
# be covered separately
|
|
||||||
mock_proxy = mock.patch(
|
|
||||||
"%s.%s" % (SERVICE_PLUGIN_NAME, '_set_create_lswitch_proxy'))
|
|
||||||
mock_proxy.start()
|
|
||||||
super(NvpRouterTestCase, self).setUp(plugin=plugin, ext_mgr=ext_mgr,
|
|
||||||
service_plugins=service_plugins)
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceRouterTest(test_nicira_plugin.NiciraL3NatTest,
|
class ServiceRouterTest(test_nicira_plugin.NiciraL3NatTest,
|
||||||
test_l3_plugin.L3NatTestCaseMixin):
|
test_l3_plugin.L3NatTestCaseMixin):
|
||||||
|
|
||||||
@ -169,7 +156,8 @@ class ServiceRouterTest(test_nicira_plugin.NiciraL3NatTest,
|
|||||||
return router_req.get_response(self.ext_api)
|
return router_req.get_response(self.ext_api)
|
||||||
|
|
||||||
|
|
||||||
class ServiceRouterTestCase(ServiceRouterTest, NvpRouterTestCase):
|
class ServiceRouterTestCase(ServiceRouterTest,
|
||||||
|
test_nicira_plugin.TestNiciraL3NatTestCase):
|
||||||
|
|
||||||
def test_router_create(self):
|
def test_router_create(self):
|
||||||
name = 'router1'
|
name = 'router1'
|
||||||
|
@ -379,7 +379,8 @@ class L3NatTestCaseMixin(object):
|
|||||||
|
|
||||||
def _router_interface_action(self, action, router_id, subnet_id, port_id,
|
def _router_interface_action(self, action, router_id, subnet_id, port_id,
|
||||||
expected_code=exc.HTTPOk.code,
|
expected_code=exc.HTTPOk.code,
|
||||||
expected_body=None):
|
expected_body=None,
|
||||||
|
tenant_id=None):
|
||||||
interface_data = {}
|
interface_data = {}
|
||||||
if subnet_id:
|
if subnet_id:
|
||||||
interface_data.update({'subnet_id': subnet_id})
|
interface_data.update({'subnet_id': subnet_id})
|
||||||
@ -388,6 +389,10 @@ class L3NatTestCaseMixin(object):
|
|||||||
|
|
||||||
req = self.new_action_request('routers', interface_data, router_id,
|
req = self.new_action_request('routers', interface_data, router_id,
|
||||||
"%s_router_interface" % action)
|
"%s_router_interface" % action)
|
||||||
|
# if tenant_id was specified, create a tenant context for this request
|
||||||
|
if tenant_id:
|
||||||
|
req.environ['neutron.context'] = context.Context(
|
||||||
|
'', tenant_id)
|
||||||
res = req.get_response(self.ext_api)
|
res = req.get_response(self.ext_api)
|
||||||
self.assertEqual(res.status_int, expected_code)
|
self.assertEqual(res.status_int, expected_code)
|
||||||
response = self.deserialize(self.fmt, res)
|
response = self.deserialize(self.fmt, res)
|
||||||
@ -734,10 +739,6 @@ class L3NatTestCaseBase(L3NatTestCaseMixin):
|
|||||||
def test_router_add_interface_subnet_with_port_from_other_tenant(self):
|
def test_router_add_interface_subnet_with_port_from_other_tenant(self):
|
||||||
tenant_id = _uuid()
|
tenant_id = _uuid()
|
||||||
other_tenant_id = _uuid()
|
other_tenant_id = _uuid()
|
||||||
tenant_context = context.Context(user_id=None, tenant_id=tenant_id)
|
|
||||||
admin_context = context.get_admin_context()
|
|
||||||
with mock.patch('neutron.context.Context') as ctx:
|
|
||||||
ctx.return_value = admin_context
|
|
||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.router(tenant_id=tenant_id),
|
self.router(tenant_id=tenant_id),
|
||||||
self.network(tenant_id=tenant_id),
|
self.network(tenant_id=tenant_id),
|
||||||
@ -745,26 +746,25 @@ class L3NatTestCaseBase(L3NatTestCaseMixin):
|
|||||||
with contextlib.nested(
|
with contextlib.nested(
|
||||||
self.subnet(network=n1, cidr='10.0.0.0/24'),
|
self.subnet(network=n1, cidr='10.0.0.0/24'),
|
||||||
self.subnet(network=n2, cidr='10.1.0.0/24')) as (s1, s2):
|
self.subnet(network=n2, cidr='10.1.0.0/24')) as (s1, s2):
|
||||||
ctx.return_value = admin_context
|
|
||||||
body = self._router_interface_action(
|
body = self._router_interface_action(
|
||||||
'add',
|
'add',
|
||||||
r['router']['id'],
|
r['router']['id'],
|
||||||
s2['subnet']['id'],
|
s2['subnet']['id'],
|
||||||
None)
|
None)
|
||||||
self.assertIn('port_id', body)
|
self.assertIn('port_id', body)
|
||||||
ctx.return_value = tenant_context
|
|
||||||
self._router_interface_action(
|
self._router_interface_action(
|
||||||
'add',
|
'add',
|
||||||
r['router']['id'],
|
r['router']['id'],
|
||||||
s1['subnet']['id'],
|
s1['subnet']['id'],
|
||||||
None)
|
None,
|
||||||
|
tenant_id=tenant_id)
|
||||||
self.assertIn('port_id', body)
|
self.assertIn('port_id', body)
|
||||||
self._router_interface_action(
|
self._router_interface_action(
|
||||||
'remove',
|
'remove',
|
||||||
r['router']['id'],
|
r['router']['id'],
|
||||||
s1['subnet']['id'],
|
s1['subnet']['id'],
|
||||||
None)
|
None,
|
||||||
ctx.return_value = admin_context
|
tenant_id=tenant_id)
|
||||||
body = self._router_interface_action(
|
body = self._router_interface_action(
|
||||||
'remove',
|
'remove',
|
||||||
r['router']['id'],
|
r['router']['id'],
|
||||||
|
Loading…
Reference in New Issue
Block a user