NSX|V: Combine plugin & MD proxy unit tests

Combining the NSXv plugin unit tests with the mdproxy unit
tests, by enabling the MD proxy, and overriding different
list commands to skip internal MD proxy objects.
This is done in order not to run each test twice, which
prolongs the unitests significantly.

Change-Id: I26073aaf9c8ee6445b900f122420620d2d25c78c
This commit is contained in:
Adit Sarfaty 2018-07-26 11:29:25 +03:00
parent 186beb053d
commit 6bc5845515
6 changed files with 262 additions and 345 deletions

View File

@ -141,7 +141,7 @@ class NeutronSimpleDvsTestCase(test_plugin.NeutronDbPluginV2TestCase):
def setUp(self, mock_moref, mock_session,
plugin=PLUGIN_NAME,
ext_mgr=None,
service_plugins=None):
service_plugins=None, **kwargs):
# Ensure that DVS is enabled
cfg.CONF.set_override('host_ip', 'fake_ip', group='dvs')
cfg.CONF.set_override('host_username', 'fake_user', group='dvs')

View File

@ -54,7 +54,8 @@ class NsxTVDPluginTestCase(v_tests.NsxVPluginV2TestCase,
super(NsxTVDPluginTestCase, self).setUp(
plugin=plugin,
ext_mgr=ext_mgr)
ext_mgr=ext_mgr,
with_md_proxy=False)
self._project_id = _uuid()
self.core_plugin = directory.get_plugin()

View File

@ -1,315 +0,0 @@
# Copyright (c) 2017 OpenStack Foundation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mock
from oslo_config import cfg
from neutron_lib import context
from vmware_nsx.db import nsxv_db
from vmware_nsx.db import nsxv_models
from vmware_nsx.plugins.nsx_v.vshield.common import (
constants as vcns_const)
from vmware_nsx.plugins.nsx_v.vshield import edge_utils
from vmware_nsx.tests.unit.nsx_v import test_plugin
PLUGIN_NAME = 'vmware_nsx.plugin.NsxVPlugin'
# Run all relevant plugin tests when the metadata proxy is enabled.
# Those tests does not specifically test the md_proxy. just verify that
# nothing gets broken.
class NsxVPluginWithMdV2TestCase(test_plugin.NsxVPluginV2TestCase):
def setUp(self, plugin=PLUGIN_NAME,
ext_mgr=None,
service_plugins=None):
# Add the metadata configuration
cfg.CONF.set_override('mgt_net_moid', 'net-1', group="nsxv")
cfg.CONF.set_override('mgt_net_proxy_ips', ['2.2.2.2'], group="nsxv")
cfg.CONF.set_override('mgt_net_proxy_netmask', '255.255.255.0',
group="nsxv")
cfg.CONF.set_override('mgt_net_default_gateway', '1.1.1.1',
group="nsxv")
cfg.CONF.set_override('nova_metadata_ips', ['3.3.3.3'], group="nsxv")
# Add some mocks required for the md code
mock_alloc_vnic = mock.patch.object(nsxv_db, 'allocate_edge_vnic')
mock_alloc_vnic_inst = mock_alloc_vnic.start()
mock_alloc_vnic_inst.return_value = nsxv_models.NsxvEdgeVnicBinding
mock.patch.object(edge_utils, "update_internal_interface").start()
super(NsxVPluginWithMdV2TestCase, self).setUp(
plugin=plugin, ext_mgr=ext_mgr,
service_plugins=service_plugins)
self.context = context.get_admin_context()
self.internal_net_id = nsxv_db.get_nsxv_internal_network_for_az(
self.context.session,
vcns_const.InternalEdgePurposes.INTER_EDGE_PURPOSE,
'default')['network_id']
class TestNetworksWithMdV2(test_plugin.TestNetworksV2,
NsxVPluginWithMdV2TestCase):
# Skip all the tests that count networks, as there is an
# additional internal network for metadata.
def test_list_networks_with_sort_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_without_pk_in_fields_pagination_emulated(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_sort_emulated(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_shared(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_without_pk_in_fields_pagination_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_parameters(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_pagination_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_pagination_reverse_emulated(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_pagination_emulated(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_pagination_reverse_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_networks_with_fields(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_networks_bulk_wrong_input(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_networks_bulk_native_plugin_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_networks_bulk_native_quotas(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_networks_bulk_emulated_plugin_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_cannot_delete_md_net(self):
req = self.new_delete_request('networks', self.internal_net_id)
net_del_res = req.get_response(self.api)
self.assertEqual(net_del_res.status_int, 400)
class TestSubnetsWithMdV2(test_plugin.TestSubnetsV2,
NsxVPluginWithMdV2TestCase):
# Skip all the tests that count subnets, as there is an
# additional internal subnet for metadata.
def test_list_subnets_with_sort_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets_with_sort_emulated(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets_with_pagination_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets_with_parameter(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets_with_pagination_emulated(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets_filtering_by_unknown_filter(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets_shared(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_list_subnets(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_subnets_bulk_native_plugin_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_subnets_bulk_native_quotas(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_subnets_bulk_emulated_plugin_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_cannot_delete_md_subnet(self):
query_params = "network_id=%s" % self.internal_net_id
res = self._list('subnets',
neutron_context=self.context,
query_params=query_params)
internal_sub = res['subnets'][0]['id']
req = self.new_delete_request('subnets', internal_sub)
net_del_res = req.get_response(self.api)
self.assertEqual(net_del_res.status_int, 400)
class TestExclusiveRouterWithMdTestCase(
test_plugin.TestExclusiveRouterTestCase,
NsxVPluginWithMdV2TestCase):
# Skip all the tests that count firewall rules, as there are
# some MD specific rules
def test_router_set_gateway_with_nosnat(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_interfaces_different_tenants_update_firewall(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_interfaces_with_update_firewall(self):
self.skipTest("The test is not suitable for the metadata test case")
# Skip all the tests that count routers or ports, as there is
# an additional router for the md proxy
def test_router_list_with_pagination_reverse(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list_with_sort(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list_with_pagination(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_add_interface_delete_port_after_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_router_fail_at_the_backend(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_floatingip_delete_router_intf_with_subnet_id_returns_409(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_floatingip_delete_router_intf_with_port_id_returns_409(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_address_scope_snat_rules(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_address_scope_fw_rules(self):
self.skipTest("The test is not suitable for the metadata test case")
class TestVdrWithMdTestCase(test_plugin.TestVdrTestCase,
NsxVPluginWithMdV2TestCase):
# Skip all the tests that count firewall rules, as there are
# some MD specific rules
def test_router_set_gateway_with_nosnat(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_interfaces_different_tenants_update_firewall(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_interfaces_with_update_firewall(self):
self.skipTest("The test is not suitable for the metadata test case")
# Skip all the tests that count routers or ports, as there is
# an additional router for the md proxy
def test_router_list_with_pagination_reverse(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list_with_sort(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list_with_pagination(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_add_interface_delete_port_after_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_router_fail_at_the_backend(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_floatingip_delete_router_intf_with_subnet_id_returns_409(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_floatingip_delete_router_intf_with_port_id_returns_409(self):
self.skipTest("The test is not suitable for the metadata test case")
#TODO(asarfaty): fix some mocks so those tests will pass
def test_router_plr_binding_default_size(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_plr_binding_configured_size(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_plr_binding_default_az(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_plr_binding_with_az(self):
self.skipTest("The test is not suitable for the metadata test case")
class TestSharedRouterWithMdTestCase(test_plugin.TestSharedRouterTestCase,
NsxVPluginWithMdV2TestCase):
# Skip all the tests that count firewall rules, as there are
# some MD specific rules
def test_router_set_gateway_with_nosnat(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_routers_set_gateway_with_nosnat(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_interfaces_different_tenants_update_firewall(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_interfaces_with_update_firewall(self):
self.skipTest("The test is not suitable for the metadata test case")
# Skip all the tests that count routers or ports, as there is
# an additional router for the md proxy
def test_router_list_with_pagination_reverse(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list_with_sort(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list_with_pagination(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_list(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_router_add_interface_delete_port_after_failure(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_create_router_fail_at_the_backend(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_floatingip_delete_router_intf_with_subnet_id_returns_409(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_floatingip_delete_router_intf_with_port_id_returns_409(self):
self.skipTest("The test is not suitable for the metadata test case")

View File

@ -58,12 +58,14 @@ from neutron_lib.utils import net
from oslo_config import cfg
from oslo_utils import uuidutils
import six
from testtools import matchers
import webob.exc
from vmware_nsx._i18n import _
from vmware_nsx.common import config
from vmware_nsx.common import exceptions as nsxv_exc
from vmware_nsx.common import nsx_constants
from vmware_nsx.common import nsxv_constants
from vmware_nsx.common import utils as c_utils
from vmware_nsx.db import nsxv_db
from vmware_nsx.dvs import dvs
@ -188,7 +190,9 @@ class NsxVPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
def setUp(self, mock_deploy_edge,
plugin=PLUGIN_NAME,
ext_mgr=None,
service_plugins=None):
service_plugins=None,
with_md_proxy=True,
**kwargs):
test_utils.override_nsx_ini_test()
mock_vcns = mock.patch(vmware.VCNS_NAME, autospec=True)
mock_vcns_instance = mock_vcns.start()
@ -219,6 +223,23 @@ class NsxVPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
cfg.CONF.set_override("resource_pool_id", self.default_res_pool,
group="nsxv")
set_az_in_config('az7')
# Add the metadata configuration
self.with_md_proxy = with_md_proxy
if self.with_md_proxy:
cfg.CONF.set_override('mgt_net_moid', 'net-1', group="nsxv")
cfg.CONF.set_override('mgt_net_proxy_ips', ['2.2.2.2'],
group="nsxv")
cfg.CONF.set_override('mgt_net_proxy_netmask', '255.255.255.0',
group="nsxv")
cfg.CONF.set_override('mgt_net_default_gateway', '1.1.1.1',
group="nsxv")
cfg.CONF.set_override('nova_metadata_ips', ['3.3.3.3'],
group="nsxv")
# Add some mocks required for the md code
mock.patch.object(edge_utils, "update_internal_interface").start()
if service_plugins is not None:
# override the service plugins only if specified directly
super(NsxVPluginV2TestCase, self).setUp(
@ -244,6 +265,15 @@ class NsxVPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
# call init_complete manually. The event is not called in unit tests
plugin_instance.init_complete(None, None, {})
self.context = context.get_admin_context()
self.internal_net_id = None
if self.with_md_proxy:
self.internal_net_id = nsxv_db.get_nsxv_internal_network_for_az(
self.context.session,
vcns_const.InternalEdgePurposes.INTER_EDGE_PURPOSE,
'default')['network_id']
def _get_core_plugin_with_dvs(self):
# enable dvs features to allow policy with QOS
cfg.CONF.set_default('use_dvs_features', True, 'nsxv')
@ -252,6 +282,129 @@ class NsxVPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
plugin._vcm = dvs.VCManager()
return plugin
def _remove_md_proxy_from_list(self, items):
for r in items[:]:
if (r.get('tenant_id') == nsxv_constants.INTERNAL_TENANT_ID or
r.get('name') == 'inter-edge-net'):
items.remove(r)
def deserialize(self, content_type, response):
"""Override list actions to skip metadata internal objects
This will allow most tests to run with mdproxy
"""
ctype = 'application/%s' % content_type
data = self._deserializers[ctype].deserialize(response.body)['body']
for resource in ['networks', 'subnets', 'ports']:
if data.get(resource):
self._remove_md_proxy_from_list(data[resource])
return data
def _list(self, resource, fmt=None, neutron_context=None,
query_params=None, expected_code=webob.exc.HTTPOk.code):
fmt = fmt or self.fmt
req = self.new_list_request(resource, fmt, query_params)
if neutron_context:
req.environ['neutron.context'] = neutron_context
res = req.get_response(self._api_for_resource(resource))
self.assertEqual(expected_code, res.status_int)
if query_params and '_id=' in query_params:
# Do not remove objects if their id was requested specifically
return super(NsxVPluginV2TestCase, self).deserialize(fmt, res)
else:
return self.deserialize(fmt, res)
def _test_list_with_pagination(self, resource, items, sort,
limit, expected_page_num,
resources=None,
query_params='',
verify_key='id'):
"""Override list actions to skip metadata internal objects
This will allow most tests to run with mdproxy
"""
if not resources:
resources = '%ss' % resource
query_str = query_params + '&' if query_params else ''
query_str = query_str + ("limit=%s&sort_key=%s&"
"sort_dir=%s") % (limit, sort[0], sort[1])
req = self.new_list_request(resources, params=query_str)
items_res = []
page_num = 0
api = self._api_for_resource(resources)
resource = resource.replace('-', '_')
resources = resources.replace('-', '_')
while req:
page_num = page_num + 1
res = super(NsxVPluginV2TestCase, self).deserialize(
self.fmt, req.get_response(api))
self.assertThat(len(res[resources]),
matchers.LessThan(limit + 1))
items_res = items_res + res[resources]
req = None
if '%s_links' % resources in res:
for link in res['%s_links' % resources]:
if link['rel'] == 'next':
content_type = 'application/%s' % self.fmt
req = testlib_api.create_request(link['href'],
'', content_type)
self.assertEqual(len(res[resources]),
limit)
# skip md-proxy objects
orig_items_num = len(items_res)
self._remove_md_proxy_from_list(items_res)
# Test number of pages only if no mdproxy entries were removed
if orig_items_num == len(items_res):
self.assertEqual(expected_page_num, page_num)
self.assertEqual([item[resource][verify_key] for item in items],
[n[verify_key] for n in items_res])
def _test_list_with_pagination_reverse(self, resource, items, sort,
limit, expected_page_num,
resources=None,
query_params=''):
"""Override list actions to skip metadata internal objects
This will allow most tests to run with mdproxy
"""
if not resources:
resources = '%ss' % resource
resource = resource.replace('-', '_')
api = self._api_for_resource(resources)
marker = items[-1][resource]['id']
query_str = query_params + '&' if query_params else ''
query_str = query_str + ("limit=%s&page_reverse=True&"
"sort_key=%s&sort_dir=%s&"
"marker=%s") % (limit, sort[0], sort[1],
marker)
req = self.new_list_request(resources, params=query_str)
item_res = [items[-1][resource]]
page_num = 0
resources = resources.replace('-', '_')
while req:
page_num = page_num + 1
res = super(NsxVPluginV2TestCase, self).deserialize(
self.fmt, req.get_response(api))
self.assertThat(len(res[resources]),
matchers.LessThan(limit + 1))
res[resources].reverse()
item_res = item_res + res[resources]
req = None
if '%s_links' % resources in res:
for link in res['%s_links' % resources]:
if link['rel'] == 'previous':
content_type = 'application/%s' % self.fmt
req = testlib_api.create_request(link['href'],
'', content_type)
self.assertEqual(len(res[resources]),
limit)
# skip md-proxy objects
orig_items_num = len(item_res)
self._remove_md_proxy_from_list(item_res)
# Test number of pages only if no mdproxy entries were removed
if orig_items_num == len(item_res):
self.assertEqual(expected_page_num, page_num)
expected_res = [item[resource]['id'] for item in items]
expected_res.reverse()
self.assertEqual(expected_res, [n['id'] for n in item_res])
class TestNetworksV2(test_plugin.TestNetworksV2, NsxVPluginV2TestCase):
@ -415,11 +568,13 @@ class TestNetworksV2(test_plugin.TestNetworksV2, NsxVPluginV2TestCase):
with self.network(name='net2', shared=True):
req = self.new_list_request('networks')
res = self.deserialize('json', req.get_response(self.api))
###self._remove_md_proxy_from_list(res['networks'])
self.assertEqual(len(res['networks']), 2)
req_2 = self.new_list_request('networks')
req_2.environ['neutron.context'] = context.Context('',
'somebody')
res = self.deserialize('json', req_2.get_response(self.api))
###self._remove_md_proxy_from_list(res['networks'])
# tenant must see a single network
self.assertEqual(len(res['networks']), 1)
@ -843,6 +998,28 @@ class TestNetworksV2(test_plugin.TestNetworksV2, NsxVPluginV2TestCase):
self.assertEqual([],
net['availability_zones'])
def test_list_networks_with_fields(self):
with self.network(name='net1'):
req = self.new_list_request('networks',
params='fields=name')
res = self.deserialize(self.fmt, req.get_response(self.api))
self._remove_md_proxy_from_list(res['networks'])
self.assertEqual(1, len(res['networks']))
net = res['networks'][0]
self.assertEqual('net1', net['name'])
self.assertNotIn('id', net)
self.assertNotIn('tenant_id', net)
self.assertNotIn('project_id', net)
def test_list_networks_without_pk_in_fields_pagination_native(self):
self.skipTest("The test is not suitable for the metadata test case")
def test_cannot_delete_md_net(self):
if self.internal_net_id:
req = self.new_delete_request('networks', self.internal_net_id)
net_del_res = req.get_response(self.api)
self.assertEqual(net_del_res.status_int, 400)
class TestVnicIndex(NsxVPluginV2TestCase,
test_vnic_index.VnicIndexDbTestCase):
@ -2066,6 +2243,17 @@ class TestSubnetsV2(NsxVPluginV2TestCase,
cidr='169.254.128.128/25')
self.assertEqual(ctx_manager.exception.code, 400)
def test_cannot_delete_md_subnet(self):
if self.internal_net_id:
query_params = "network_id=%s" % self.internal_net_id
res = self._list('subnets',
neutron_context=self.context,
query_params=query_params)
internal_sub = res['subnets'][0]['id']
req = self.new_delete_request('subnets', internal_sub)
net_del_res = req.get_response(self.api)
self.assertEqual(net_del_res.status_int, 400)
class TestSubnetPoolsV2(NsxVPluginV2TestCase, test_plugin.TestSubnetsV2):
def setUp(self,
@ -2449,13 +2637,19 @@ class L3NatTestCaseBase(test_l3_plugin.L3NatTestCaseMixin):
self.assertEqual(fp2['floatingip']['router_id'],
r2['router']['id'])
def _get_md_proxy_fw_rules(self):
if not self.with_md_proxy:
return []
return md_proxy.get_router_fw_rules()
@mock.patch.object(edge_utils, "update_firewall")
def test_router_set_gateway_with_nosnat(self, mock):
expected_fw = [{'action': 'allow',
'enabled': True,
'name': 'Subnet Rule',
'source_ip_address': [],
'destination_ip_address': []}]
'destination_ip_address': []}
] + self._get_md_proxy_fw_rules()
nosnat_fw = [{'action': 'allow',
'enabled': True,
'name': 'No SNAT Rule',
@ -3089,7 +3283,8 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase,
'enabled': True,
'name': 'Subnet Rule',
'source_ip_address': expected_cidrs,
'destination_ip_address': expected_cidrs}]
'destination_ip_address': expected_cidrs}
] + self._get_md_proxy_fw_rules()
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(self._recursive_sort_list(expected_fw),
self._recursive_sort_list(fw_rules))
@ -3244,7 +3439,8 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase,
'enabled': True,
'name': 'Subnet Rule',
'source_ip_address': expected_cidrs,
'destination_ip_address': expected_cidrs}]
'destination_ip_address': expected_cidrs}
] + self._get_md_proxy_fw_rules()
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(self._recursive_sort_list(expected_fw),
self._recursive_sort_list(fw_rules))
@ -3253,11 +3449,12 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase,
s1['subnet']['id'],
None,
tenant_id=tenant_id)
self._router_interface_action('remove',
r['router']['id'],
s2['subnet']['id'],
None)
expected_fw = []
expected_fw = self._get_md_proxy_fw_rules()
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(expected_fw, fw_rules)
@ -3596,15 +3793,17 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase,
# check fw rules
fw_rules = update_fw.call_args[0][3][
'firewall_rule_list']
self.assertEqual(2, len(fw_rules))
exp_fw_len = 5 if self.with_md_proxy else 2
pool_rule_ind = 4 if self.with_md_proxy else 1
pool_rule = fw_rules[pool_rule_ind]
self.assertEqual(exp_fw_len, len(fw_rules))
self.assertEqual('Allocation Pool Rule',
fw_rules[1]['name'])
self.assertEqual('allow', fw_rules[1]['action'])
self.assertEqual(
int_subnet['subnet']['cidr'],
fw_rules[1]['destination_ip_address'][0])
pool_rule['name'])
self.assertEqual('allow', pool_rule['action'])
self.assertEqual(int_subnet['subnet']['cidr'],
pool_rule['destination_ip_address'][0])
self.assertEqual('external',
fw_rules[1]['source_vnic_groups'][0])
pool_rule['source_vnic_groups'][0])
def test_router_address_scope_fw_rules(self):
"""Test that if the router interfaces has different address scope
@ -3652,12 +3851,13 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase,
'action': 'allow',
'name': 'Subnet Rule',
'source_ip_address': [subnet2['subnet']['cidr'],
subnet3['subnet']['cidr']]}]
subnet3['subnet']['cidr']]}
] + self._get_md_proxy_fw_rules()
# check the final fw rules
fw_rules = update_fw.call_args[0][3][
'firewall_rule_list']
self.assertEqual(2, len(fw_rules))
self.assertEqual(len(expected_rules), len(fw_rules))
self.assertEqual(self._recursive_sort_list(expected_rules),
self._recursive_sort_list(fw_rules))
@ -3741,6 +3941,23 @@ class TestExclusiveRouterTestCase(L3NatTest, L3NatTestCaseBase,
def test_router_address_scope_gw_change(self):
self._test_router_address_scope_change(change_gw=True)
def test_router_add_interface_delete_port_after_failure(self):
with self.router() as r, self.subnet(enable_dhcp=False) as s:
plugin = directory.get_plugin()
# inject a failure in the update port that happens at the end
# to ensure the port gets deleted
with mock.patch.object(
plugin, 'update_port',
side_effect=n_exc.InvalidInput(error_message='x')):
self._router_interface_action('add',
r['router']['id'],
s['subnet']['id'],
None,
webob.exc.HTTPBadRequest.code)
exp_num_of_ports = 1 if self.with_md_proxy else 0
ports = plugin.get_ports(context.get_admin_context())
self.assertEqual(exp_num_of_ports, len(ports))
class ExtGwModeTestCase(NsxVPluginV2TestCase,
test_ext_gw_mode.ExtGwModeIntTestCase):
@ -5031,8 +5248,10 @@ class TestSharedRouterTestCase(L3NatTest, L3NatTestCaseBase,
expected_fw1[0]['source_ip_address'] = ['11.0.0.0/24']
expected_fw1[0]['destination_ip_address'] = ['11.0.0.0/24']
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(self._recursive_sort_list(expected_fw1),
self._recursive_sort_list(fw_rules))
self.assertEqual(
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1),
self._recursive_sort_list(fw_rules))
self._router_interface_action('add',
r2['router']['id'],
s2['subnet']['id'],
@ -5047,7 +5266,9 @@ class TestSharedRouterTestCase(L3NatTest, L3NatTestCaseBase,
expected_fw2[0]['destination_ip_address'] = ['12.0.0.0/24']
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(
self._recursive_sort_list(expected_fw1 + expected_fw2),
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1 +
expected_fw2),
self._recursive_sort_list(fw_rules))
self._update_router_enable_snat(
r1['router']['id'],
@ -5056,8 +5277,9 @@ class TestSharedRouterTestCase(L3NatTest, L3NatTestCaseBase,
nosnat_fw1[0]['destination_ip_address'] = ['11.0.0.0/24']
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(
self._recursive_sort_list(expected_fw1 + expected_fw2 +
nosnat_fw1),
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1 +
expected_fw2 + nosnat_fw1),
self._recursive_sort_list(fw_rules))
self._update_router_enable_snat(
r2['router']['id'],
@ -5066,8 +5288,9 @@ class TestSharedRouterTestCase(L3NatTest, L3NatTestCaseBase,
nosnat_fw2[0]['destination_ip_address'] = ['12.0.0.0/24']
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(
self._recursive_sort_list(expected_fw1 + expected_fw2 +
nosnat_fw1 + nosnat_fw2),
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1 +
expected_fw2 + nosnat_fw1 + nosnat_fw2),
self._recursive_sort_list(fw_rules))
self._update_router_enable_snat(
r2['router']['id'],
@ -5075,8 +5298,9 @@ class TestSharedRouterTestCase(L3NatTest, L3NatTestCaseBase,
True)
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(
self._recursive_sort_list(expected_fw1 + expected_fw2 +
nosnat_fw1),
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1 +
expected_fw2 + nosnat_fw1),
self._recursive_sort_list(fw_rules))
self._router_interface_action('remove',
r2['router']['id'],
@ -5084,14 +5308,16 @@ class TestSharedRouterTestCase(L3NatTest, L3NatTestCaseBase,
None)
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(
self._recursive_sort_list(expected_fw1 + nosnat_fw1),
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1 + nosnat_fw1),
self._recursive_sort_list(fw_rules))
self._remove_external_gateway_from_router(
r1['router']['id'],
ext_subnet['subnet']['network_id'])
fw_rules = mock.call_args[0][3]['firewall_rule_list']
self.assertEqual(
self._recursive_sort_list(expected_fw1),
self._recursive_sort_list(
self._get_md_proxy_fw_rules() + expected_fw1),
self._recursive_sort_list(fw_rules))
self._router_interface_action('remove',
r1['router']['id'],
@ -5577,7 +5803,7 @@ class TestRouterFlavorTestCase(extension.ExtensionTestCase,
def assertSyslogConfig(self, expected):
"""Verify syslog was updated in fake driver
Test assumes edge ids are created sequentally starting from edge-1
Test assumes edge ids are created sequentially starting from edge-1
"""
edge_id = ('edge-%s' % self._iteration)
actual = self.plugin.nsx_v.vcns.get_edge_syslog(edge_id)[1]

View File

@ -249,7 +249,9 @@ class FakeVcns(object):
response = {
'label': 'vNic_1',
'name': 'internal1',
'addressGroups': {'addressGroups': []},
'addressGroups': {
'addressGroups': [{'primaryAddress': '1.1.1.1'}]},
'portgroupId': '1',
'mtu': 1500,
'type': 'trunk',
'subInterfaces': {'subInterfaces': []},
@ -788,6 +790,9 @@ class FakeVcns(object):
response['config'] = self._fake_loadbalancer_config[edge_id]
return self.return_helper(header, response)
def get_loadbalancer_statistics(self, edge_id):
return [{}, {}]
def update_ipsec_config(self, edge_id, ipsec_config):
self.fake_ipsecvpn_dict[edge_id] = ipsec_config
header = {'status': 204}

View File

@ -215,7 +215,7 @@ class NsxV3PluginTestCaseMixin(test_plugin.NeutronDbPluginV2TestCase,
def setUp(self, plugin=PLUGIN_NAME,
ext_mgr=None,
service_plugins=None):
service_plugins=None, **kwargs):
self._patchers = []