diff --git a/doc/source/admin/config-az.rst b/doc/source/admin/config-az.rst index 7278a977cfc..0d49fa2a9f9 100644 --- a/doc/source/admin/config-az.rst +++ b/doc/source/admin/config-az.rst @@ -94,7 +94,7 @@ To confirm the agent's availability zone: | availability_zone | zone-1 | | binary | neutron-l3-agent | | configurations | agent_mode='legacy', ex_gw_ports='2', | - | | external_network_bridge='', floating_ips='0', | + | | floating_ips='0', | | | gateway_external_network_id='', | | | handle_internal_only_routers='True', | | | interface_driver='openvswitch', interfaces='4', | diff --git a/doc/source/admin/config-dvr-ha-snat.rst b/doc/source/admin/config-dvr-ha-snat.rst index e9299a11878..982cd256990 100644 --- a/doc/source/admin/config-dvr-ha-snat.rst +++ b/doc/source/admin/config-dvr-ha-snat.rst @@ -136,13 +136,8 @@ Network nodes [DEFAULT] ha_vrrp_auth_password = password interface_driver = openvswitch - external_network_bridge = agent_mode = dvr_snat - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. Compute nodes ------------- @@ -170,7 +165,6 @@ Compute nodes [DEFAULT] interface_driver = openvswitch - external_network_bridge = agent_mode = dvr Replace ``TUNNEL_INTERFACE_IP_ADDRESS`` with the IP address of the interface diff --git a/doc/source/admin/config-services-agent.rst b/doc/source/admin/config-services-agent.rst index 1299de9625a..22fdc4aebff 100644 --- a/doc/source/admin/config-services-agent.rst +++ b/doc/source/admin/config-services-agent.rst @@ -39,8 +39,7 @@ should be instructed to act upon these values through RPC. Each individual agent may have its own configuration file. This file should be loaded after the main ``neutron.conf`` file, so the agent configuration takes precedence. The agent-specific configuration may contain configurations which -vary between hosts in a neutron deployment such as the -``external_network_bridge`` for an L3 agent. If any agent requires access to -additional external services beyond the neutron RPC, those endpoints should be -defined in the agent-specific configuration file (for example, nova metadata -for metadata agent). +vary between hosts in a neutron deployment such as the ``local_ip`` for an L2 +agent. If any agent requires access to additional external services beyond the +neutron RPC, those endpoints should be defined in the agent-specific +configuration file (for example, nova metadata for metadata agent). diff --git a/doc/source/admin/deploy-lb-ha-vrrp.rst b/doc/source/admin/deploy-lb-ha-vrrp.rst index b7c3051d323..b26c8360c29 100644 --- a/doc/source/admin/deploy-lb-ha-vrrp.rst +++ b/doc/source/admin/deploy-lb-ha-vrrp.rst @@ -118,12 +118,6 @@ Network node 2 [DEFAULT] interface_driver = linuxbridge - external_network_bridge = - - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. #. Start the following services: diff --git a/doc/source/admin/deploy-lb-selfservice.rst b/doc/source/admin/deploy-lb-selfservice.rst index 42bc0a55b01..4a3bf0b1c22 100644 --- a/doc/source/admin/deploy-lb-selfservice.rst +++ b/doc/source/admin/deploy-lb-selfservice.rst @@ -146,12 +146,6 @@ Network node [DEFAULT] interface_driver = linuxbridge - external_network_bridge = - - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. #. Start the following services: diff --git a/doc/source/admin/deploy-ovs-ha-dvr.rst b/doc/source/admin/deploy-ovs-ha-dvr.rst index afc23c420fc..dc748456b78 100644 --- a/doc/source/admin/deploy-ovs-ha-dvr.rst +++ b/doc/source/admin/deploy-ovs-ha-dvr.rst @@ -97,10 +97,6 @@ Network node [DEFAULT] agent_mode = dvr_snat - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. #. Restart the following services: @@ -125,14 +121,8 @@ Compute nodes [DEFAULT] interface_driver = openvswitch - external_network_bridge = agent_mode = dvr - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. - #. Restart the following services: * Open vSwitch agent diff --git a/doc/source/admin/deploy-ovs-ha-vrrp.rst b/doc/source/admin/deploy-ovs-ha-vrrp.rst index caa8a8a32e5..1c78424122c 100644 --- a/doc/source/admin/deploy-ovs-ha-vrrp.rst +++ b/doc/source/admin/deploy-ovs-ha-vrrp.rst @@ -119,12 +119,6 @@ Network node 2 [DEFAULT] interface_driver = openvswitch - external_network_bridge = - - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. #. Start the following services: diff --git a/doc/source/admin/deploy-ovs-selfservice.rst b/doc/source/admin/deploy-ovs-selfservice.rst index e39573ebde5..0f6ad59fe38 100644 --- a/doc/source/admin/deploy-ovs-selfservice.rst +++ b/doc/source/admin/deploy-ovs-selfservice.rst @@ -150,12 +150,6 @@ Network node [DEFAULT] interface_driver = openvswitch - external_network_bridge = - - .. note:: - - The ``external_network_bridge`` option intentionally contains - no value. #. Start the following services: diff --git a/doc/source/contributor/internals/services_and_agents.rst b/doc/source/contributor/internals/services_and_agents.rst index df30de7c467..a23a61aba64 100644 --- a/doc/source/contributor/internals/services_and_agents.rst +++ b/doc/source/contributor/internals/services_and_agents.rst @@ -103,7 +103,7 @@ should be instructed to act upon these values via RPC. Each individual agent may have its own configuration file. This file should be loaded after the main ```neutron.conf``` file, so the agent configuration takes precedence. The agent specific configuration may contain configurations which -vary between hosts in a Neutron deployment such as the external_network_bridge -for a L3 agent. If any agent requires access to additional external services -beyond the Neutron RPC, those endpoints should be defined in the agent specific +vary between hosts in a Neutron deployment such as the ``local_ip`` for an L2 +agent. If any agent requires access to additional external services beyond the +neutron RPC, those endpoints should be defined in the agent-specific configuration file (e.g. nova metadata for metadata agent). diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py index 415a36140fe..b01a28d2bcd 100644 --- a/neutron/agent/l3/agent.py +++ b/neutron/agent/l3/agent.py @@ -50,7 +50,6 @@ from neutron.agent.l3 import l3_agent_extensions_manager as l3_ext_manager from neutron.agent.l3 import legacy_router from neutron.agent.l3 import namespace_manager from neutron.agent.linux import external_process -from neutron.agent.linux import ip_lib from neutron.agent.linux import pd from neutron.agent.linux import utils as linux_utils from neutron.agent.metadata import driver as metadata_driver @@ -359,12 +358,6 @@ class L3NATAgent(ha.AgentMixin, if self.conf.gateway_external_network_id: return self.conf.gateway_external_network_id - # L3 agent doesn't use external_network_bridge to handle external - # networks, so bridge_mappings with provider networks will be used - # and the L3 agent is able to handle any external networks. - if not self.conf.external_network_bridge: - return - if not force and self.target_ex_net_id: return self.target_ex_net_id @@ -542,12 +535,6 @@ class L3NATAgent(ha.AgentMixin, self._resync_router(update) def _process_router_if_compatible(self, router): - if (self.conf.external_network_bridge and - not ip_lib.device_exists(self.conf.external_network_bridge)): - LOG.error("The external network bridge '%s' does not exist", - self.conf.external_network_bridge) - return - # Either ex_net_id or handle_internal_only_routers must be set ex_net_id = (router['external_gateway_info'] or {}).get('network_id') if not ex_net_id and not self.conf.handle_internal_only_routers: @@ -844,7 +831,6 @@ class L3NATAgentWithStateReport(L3NATAgent): 'agent_mode': self.conf.agent_mode, 'handle_internal_only_routers': self.conf.handle_internal_only_routers, - 'external_network_bridge': self.conf.external_network_bridge, 'gateway_external_network_id': self.conf.gateway_external_network_id, 'interface_driver': self.conf.interface_driver, diff --git a/neutron/agent/l3/dvr_edge_router.py b/neutron/agent/l3/dvr_edge_router.py index a5204d064ee..0351792398f 100644 --- a/neutron/agent/l3/dvr_edge_router.py +++ b/neutron/agent/l3/dvr_edge_router.py @@ -95,7 +95,6 @@ class DvrEdgeRouter(dvr_local_router.DvrLocalRouter): return self.driver.unplug(interface_name, - bridge=self.agent_conf.external_network_bridge, namespace=self.snat_namespace.name, prefix=router.EXTERNAL_DEV_PREFIX) @@ -270,7 +269,6 @@ class DvrEdgeRouter(dvr_local_router.DvrLocalRouter): LOG.debug('Deleting stale external router device: %s', d.name) self.driver.unplug( d.name, - bridge=self.agent_conf.external_network_bridge, namespace=self.snat_namespace.name, prefix=router.EXTERNAL_DEV_PREFIX) diff --git a/neutron/agent/l3/dvr_fip_ns.py b/neutron/agent/l3/dvr_fip_ns.py index e3dd76f0e22..f40abd4702a 100644 --- a/neutron/agent/l3/dvr_fip_ns.py +++ b/neutron/agent/l3/dvr_fip_ns.py @@ -163,19 +163,9 @@ class FipNamespace(namespaces.Namespace): ex_gw_port['id'], interface_name, ex_gw_port['mac_address'], - bridge=self.agent_conf.external_network_bridge, namespace=ns_name, prefix=FIP_EXT_DEV_PREFIX, mtu=ex_gw_port.get('mtu')) - if self.agent_conf.external_network_bridge: - # NOTE(Swami): for OVS implementations remove the DEAD VLAN tag - # on ports. DEAD VLAN tag is added to each newly created port - # and should be removed by L2 agent but if - # external_network_bridge is set than external gateway port is - # created in this bridge and will not be touched by L2 agent. - # This is related to lp#1767422 - self.driver.remove_vlan_tag( - self.agent_conf.external_network_bridge, interface_name) # Remove stale fg devices ip_wrapper = ip_lib.IPWrapper(namespace=ns_name) devices = ip_wrapper.get_devices() @@ -183,9 +173,7 @@ class FipNamespace(namespaces.Namespace): name = device.name if name.startswith(FIP_EXT_DEV_PREFIX) and name != interface_name: LOG.debug('DVR: unplug: %s', name) - ext_net_bridge = self.agent_conf.external_network_bridge self.driver.unplug(name, - bridge=ext_net_bridge, namespace=ns_name, prefix=FIP_EXT_DEV_PREFIX) @@ -232,9 +220,7 @@ class FipNamespace(namespaces.Namespace): # single port from FIP NS to br-ext # TODO(carl) Where does the port get deleted? LOG.debug('DVR: unplug: %s', d.name) - ext_net_bridge = self.agent_conf.external_network_bridge self.driver.unplug(d.name, - bridge=ext_net_bridge, namespace=self.name, prefix=FIP_EXT_DEV_PREFIX) diff --git a/neutron/agent/l3/dvr_snat_ns.py b/neutron/agent/l3/dvr_snat_ns.py index 30c0db95821..d09041764e8 100644 --- a/neutron/agent/l3/dvr_snat_ns.py +++ b/neutron/agent/l3/dvr_snat_ns.py @@ -53,7 +53,6 @@ class SnatNamespace(namespaces.Namespace): elif d.name.startswith(namespaces.EXTERNAL_DEV_PREFIX): self.driver.unplug( d.name, - bridge=self.agent_conf.external_network_bridge, namespace=self.name, prefix=namespaces.EXTERNAL_DEV_PREFIX) diff --git a/neutron/agent/l3/ha_router.py b/neutron/agent/l3/ha_router.py index 6a8ce531453..04db2d27ef9 100644 --- a/neutron/agent/l3/ha_router.py +++ b/neutron/agent/l3/ha_router.py @@ -449,7 +449,6 @@ class HaRouter(router.RouterInfo): else: # We are not the master node, so no need to delete ip addresses. self.driver.unplug(interface_name, - bridge=self.agent_conf.external_network_bridge, namespace=self.ns_name, prefix=router.EXTERNAL_DEV_PREFIX) diff --git a/neutron/agent/l3/namespaces.py b/neutron/agent/l3/namespaces.py index 58b0deb6075..d9916fde94a 100644 --- a/neutron/agent/l3/namespaces.py +++ b/neutron/agent/l3/namespaces.py @@ -143,7 +143,6 @@ class RouterNamespace(Namespace): elif d.name.startswith(EXTERNAL_DEV_PREFIX): self.driver.unplug( d.name, - bridge=self.agent_conf.external_network_bridge, namespace=self.name, prefix=EXTERNAL_DEV_PREFIX) diff --git a/neutron/agent/l3/router_info.py b/neutron/agent/l3/router_info.py index 3d8b13a726d..102bc9c1f82 100644 --- a/neutron/agent/l3/router_info.py +++ b/neutron/agent/l3/router_info.py @@ -661,19 +661,9 @@ class RouterInfo(object): ex_gw_port['id'], interface_name, ex_gw_port['mac_address'], - bridge=self.agent_conf.external_network_bridge, namespace=ns_name, prefix=EXTERNAL_DEV_PREFIX, mtu=ex_gw_port.get('mtu')) - if self.agent_conf.external_network_bridge: - # NOTE(slaweq): for OVS implementations remove the DEAD VLAN tag - # on ports. DEAD VLAN tag is added to each newly created port - # and should be removed by L2 agent but if - # external_network_bridge is set than external gateway port is - # created in this bridge and will not be touched by L2 agent. - # This is related to lp#1767422 - self.driver.remove_vlan_tag( - self.agent_conf.external_network_bridge, interface_name) def _get_external_gw_ips(self, ex_gw_port): gateway_ips = [] @@ -802,7 +792,6 @@ class RouterInfo(object): ip_addr['ip_address'], prefixlen)) self.driver.unplug(interface_name, - bridge=self.agent_conf.external_network_bridge, namespace=self.ns_name, prefix=EXTERNAL_DEV_PREFIX) @@ -819,7 +808,6 @@ class RouterInfo(object): LOG.debug('Deleting stale external router device: %s', stale_dev) self.agent.pd.remove_gw_interface(self.router['id']) self.driver.unplug(stale_dev, - bridge=self.agent_conf.external_network_bridge, namespace=self.ns_name, prefix=EXTERNAL_DEV_PREFIX) diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index 418b6988de1..ddfe6afb225 100644 --- a/neutron/agent/linux/interface.py +++ b/neutron/agent/linux/interface.py @@ -238,17 +238,6 @@ class LinuxInterfaceDriver(object): def get_device_name(self, port): return (self.DEV_NAME_PREFIX + port.id)[:self.DEV_NAME_LEN] - def remove_vlan_tag(self, bridge, interface_name): - """Remove vlan tag from given interface. - - This method is necessary only for the case when deprecated - option 'external_network_bridge' is used in L3 agent as - external gateway port is then created in this external bridge - directly and it will have DEAD_VLAN_TAG added by default. - """ - # TODO(slaweq): remove it when external_network_bridge option will be - # removed - @staticmethod def configure_ipv6_ra(namespace, dev_name, value): """Configure handling of IPv6 Router Advertisements on an @@ -348,10 +337,6 @@ class OVSInterfaceDriver(LinuxInterfaceDriver): ovs = ovs_lib.OVSBridge(bridge) ovs.replace_port(device_name, *attrs) - def remove_vlan_tag(self, bridge, interface): - ovs = ovs_lib.OVSBridge(bridge) - ovs.clear_db_attribute("Port", interface, "tag") - def plug_new(self, network_id, port_id, device_name, mac_address, bridge=None, namespace=None, prefix=None, mtu=None): """Plug in the interface.""" diff --git a/neutron/cmd/ovs_cleanup.py b/neutron/cmd/ovs_cleanup.py index 723c64d21b3..4bfd1448433 100644 --- a/neutron/cmd/ovs_cleanup.py +++ b/neutron/cmd/ovs_cleanup.py @@ -60,8 +60,7 @@ def main(): def do_main(conf): - configuration_bridges = set([conf.ovs_integration_bridge, - conf.external_network_bridge]) + configuration_bridges = set([conf.ovs_integration_bridge]) ovs = ovs_lib.BaseOVS() ovs_bridges = set(ovs.get_bridges()) available_configuration_bridges = configuration_bridges & ovs_bridges diff --git a/neutron/conf/agent/common.py b/neutron/conf/agent/common.py index 34027f99366..fd31fb0a39e 100644 --- a/neutron/conf/agent/common.py +++ b/neutron/conf/agent/common.py @@ -154,17 +154,6 @@ AVAILABILITY_ZONE_OPTS = [ help=_("Availability zone of this node")), ] -EXT_NET_BRIDGE_OPTS = [ - cfg.StrOpt('external_network_bridge', default='', - deprecated_for_removal=True, - help=_("Name of bridge used for external network " - "traffic. When this parameter is set, the L3 agent will " - "plug an interface directly into an external bridge " - "which will not allow any wiring by the L2 agent. Using " - "this will result in incorrect port statuses. This " - "option is deprecated and will be removed in Ocata.")) -] - def get_log_args(conf, log_file_name, **kwargs): cmd_args = [] diff --git a/neutron/conf/agent/l3/config.py b/neutron/conf/agent/l3/config.py index a427d955d82..e82d5903b14 100644 --- a/neutron/conf/agent/l3/config.py +++ b/neutron/conf/agent/l3/config.py @@ -18,7 +18,6 @@ from neutron_lib import constants from oslo_config import cfg from neutron._i18n import _ -from neutron.conf.agent import common as config OPTS = [ @@ -58,12 +57,10 @@ OPTS = [ "False for all agents if all routers must have an " "external network gateway.")), cfg.StrOpt('gateway_external_network_id', default='', - help=_("When external_network_bridge is set, each L3 agent can " - "be associated with no more than one external network. " - "This value should be set to the UUID of that external " - "network. To allow L3 agent support multiple external " - "networks, both the external_network_bridge and " - "gateway_external_network_id must be left empty."), + help=_("To allow the L3 agent to support multiple external " + "networks, gateway_external_network_id must be left " + "empty. Otherwise this value should be set to the UUID " + "of the single external network to be used."), deprecated_for_removal=True), cfg.StrOpt('ipv6_gateway', default='', help=_("With IPv6, the network used for the external gateway " @@ -103,8 +100,6 @@ OPTS = [ '0xffff so that only the lower 16 bits will be used.')), ] -OPTS += config.EXT_NET_BRIDGE_OPTS - def register_l3_agent_config_opts(opts, cfg=cfg.CONF): cfg.register_opts(opts) diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index b15162d6895..e83eaf63d19 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -303,13 +303,6 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, def _check_router_needs_rescheduling(self, context, router_id, gw_info): """Checks whether router's l3 agent can handle the given network - When external_network_bridge is set, each L3 agent can be associated - with at most one external network. If router's new external gateway - is on other network then the router needs to be rescheduled to the - proper l3 agent. - If external_network_bridge is not set then the agent - can support multiple external networks and rescheduling is not needed - :return: list of candidate agents if rescheduling needed, None otherwise; raises exception if there is no eligible l3 agent associated with target external network @@ -344,10 +337,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, for agent in cur_agents: ext_net_id = agent['configurations'].get( 'gateway_external_network_id') - ext_bridge = agent['configurations'].get( - 'external_network_bridge', '') - if (ext_net_id == network_id or - (not ext_net_id and not ext_bridge)): + if ext_net_id == network_id or not ext_net_id: return # otherwise find l3 agent with matching gateway_external_network_id diff --git a/neutron/debug/debug_agent.py b/neutron/debug/debug_agent.py index aad29eafed0..96796674241 100644 --- a/neutron/debug/debug_agent.py +++ b/neutron/debug/debug_agent.py @@ -43,9 +43,6 @@ class NeutronDebugAgent(object): def create_probe(self, network_id, device_owner='network'): network = self._get_network(network_id) - bridge = None - if network.external: - bridge = self.conf.external_network_bridge port = self._create_port(network, device_owner) interface_name = self.driver.get_device_name(port) @@ -58,7 +55,6 @@ class NeutronDebugAgent(object): port.id, interface_name, port.mac_address, - bridge=bridge, namespace=namespace) ip_cidrs = [] for fixed_ip in port.fixed_ips: @@ -94,22 +90,16 @@ class NeutronDebugAgent(object): def delete_probe(self, port_id): port = dhcp.DictModel(self.client.show_port(port_id)['port']) - network = self._get_network(port.network_id) - bridge = None - if network.external: - bridge = self.conf.external_network_bridge namespace = self._get_namespace(port) if ip_lib.network_namespace_exists(namespace): self.driver.unplug(self.driver.get_device_name(port), - bridge=bridge, namespace=namespace) try: ip_lib.delete_network_namespace(namespace) except Exception: LOG.warning('Failed to delete namespace %s', namespace) else: - self.driver.unplug(self.driver.get_device_name(port), - bridge=bridge) + self.driver.unplug(self.driver.get_device_name(port)) self.client.delete_port(port.id) def list_probes(self): diff --git a/neutron/debug/shell.py b/neutron/debug/shell.py index 97dedec2042..f34412270ae 100644 --- a/neutron/debug/shell.py +++ b/neutron/debug/shell.py @@ -71,7 +71,6 @@ class NeutronDebugShell(shell.NeutronShell): " either --config-file or env[NEUTRON_TEST_CONFIG_FILE]")) client = self.client_manager.neutron config.register_interface_opts() - cfg.CONF.register_opts(config.EXT_NET_BRIDGE_OPTS) config.register_interface_driver_opts_helper(cfg.CONF) cfg.CONF(['--config-file', self.options.config_file]) config.setup_logging() diff --git a/neutron/tests/common/helpers.py b/neutron/tests/common/helpers.py index 0b424a1be02..9254f085835 100644 --- a/neutron/tests/common/helpers.py +++ b/neutron/tests/common/helpers.py @@ -58,8 +58,7 @@ class FakePlugin(common_db_mixin.CommonDbMixin, def _get_l3_agent_dict(host, agent_mode, internal_only=True, - ext_net_id='', ext_bridge='', - az=DEFAULT_AZ): + ext_net_id='', az=DEFAULT_AZ): return { 'agent_type': constants.AGENT_TYPE_L3, 'binary': 'neutron-l3-agent', @@ -68,7 +67,6 @@ def _get_l3_agent_dict(host, agent_mode, internal_only=True, 'availability_zone': az, 'configurations': {'agent_mode': agent_mode, 'handle_internal_only_routers': internal_only, - 'external_network_bridge': ext_bridge, 'gateway_external_network_id': ext_net_id}} @@ -82,10 +80,8 @@ def _register_agent(agent, plugin=None): def register_l3_agent(host=HOST, agent_mode=constants.L3_AGENT_MODE_LEGACY, - internal_only=True, ext_net_id='', ext_bridge='', - az=DEFAULT_AZ): - agent = _get_l3_agent_dict(host, agent_mode, internal_only, ext_net_id, - ext_bridge, az) + internal_only=True, ext_net_id='', az=DEFAULT_AZ): + agent = _get_l3_agent_dict(host, agent_mode, internal_only, ext_net_id, az) return _register_agent(agent) diff --git a/neutron/tests/fullstack/base.py b/neutron/tests/fullstack/base.py index 6fe81a37c87..2b7883ee00d 100644 --- a/neutron/tests/fullstack/base.py +++ b/neutron/tests/fullstack/base.py @@ -23,6 +23,7 @@ from neutron.common import utils as common_utils from neutron.conf.agent import common as config from neutron.tests import base as tests_base from neutron.tests.common import helpers +from neutron.tests.common import machine_fixtures from neutron.tests.common import net_helpers from neutron.tests.fullstack.resources import client as client_resource from neutron.tests import tools @@ -137,3 +138,15 @@ class BaseFullStackTestCase(testlib_api.MySQLTestCaseMixin, return available_ips self.fail("Cannot find enough free IP addresses.") + + def _create_external_vm(self, network, subnet): + vm = self.useFixture( + machine_fixtures.FakeMachine( + self.environment.central_bridge, + common_utils.ip_to_cidr(subnet['gateway_ip'], 24))) + # NOTE(slaweq): as ext_net is 'vlan' network type external_vm needs to + # send packets with proper vlan also + vm.bridge.set_db_attribute( + "Port", vm.port.name, + "tag", network.get("provider:segmentation_id")) + return vm diff --git a/neutron/tests/fullstack/resources/config.py b/neutron/tests/fullstack/resources/config.py index e758a1cf9dd..1118e9d359c 100644 --- a/neutron/tests/fullstack/resources/config.py +++ b/neutron/tests/fullstack/resources/config.py @@ -166,11 +166,13 @@ class OVSConfigFixture(ConfigFixture): base_filename='openvswitch_agent.ini') self.tunneling_enabled = self.env_desc.tunneling_enabled + ext_dev = utils.get_rand_device_name(prefix='br-eth') self.config.update({ 'ovs': { 'local_ip': local_ip, 'integration_bridge': self._generate_integration_bridge(), 'of_interface': host_desc.of_interface, + 'bridge_mappings': '%s:%s' % (PHYSICAL_NETWORK_NAME, ext_dev) }, 'securitygroup': { 'firewall_driver': host_desc.firewall_driver, @@ -190,12 +192,9 @@ class OVSConfigFixture(ConfigFixture): 'int_peer_patch_port': self._generate_int_peer(), 'tun_peer_patch_port': self._generate_tun_peer()}) else: - device = utils.get_rand_device_name(prefix='br-eth') - self.config['ovs']['bridge_mappings'] = '%s:%s' % ( - PHYSICAL_NETWORK_NAME, device) if env_desc.report_bandwidths: self.config['ovs'][c_const.RP_BANDWIDTHS] = \ - '%s:%s:%s' % (device, MINIMUM_BANDWIDTH_EGRESS_KBPS, + '%s:%s:%s' % (ext_dev, MINIMUM_BANDWIDTH_EGRESS_KBPS, MINIMUM_BANDWIDTH_INGRESS_KBPS) if env_desc.qos: @@ -350,7 +349,6 @@ class L3ConfigFixture(ConfigFixture): 'interface_driver': ('neutron.agent.linux.interface.' 'OVSInterfaceDriver'), 'ovs_integration_bridge': integration_bridge, - 'external_network_bridge': self._generate_external_bridge(), } }) @@ -362,12 +360,6 @@ class L3ConfigFixture(ConfigFixture): } }) - def _generate_external_bridge(self): - return utils.get_rand_device_name(prefix='br-ex') - - def get_external_bridge(self): - return self.config.DEFAULT.external_network_bridge - class DhcpConfigFixture(ConfigFixture): diff --git a/neutron/tests/fullstack/resources/environment.py b/neutron/tests/fullstack/resources/environment.py index ec3074ccfb8..99b6ff5e4bb 100644 --- a/neutron/tests/fullstack/resources/environment.py +++ b/neutron/tests/fullstack/resources/environment.py @@ -143,15 +143,15 @@ class Host(fixtures.Fixture): self.local_ip, test_name=self.test_name) self.useFixture(agent_cfg_fixture) + self.br_phys = self.useFixture( + net_helpers.OVSBridgeFixture( + agent_cfg_fixture.get_br_phys_name())).bridge if self.env_desc.tunneling_enabled: self.useFixture( net_helpers.OVSBridgeFixture( agent_cfg_fixture.get_br_tun_name())).bridge self.connect_to_central_network_via_tunneling() else: - self.br_phys = self.useFixture( - net_helpers.OVSBridgeFixture( - agent_cfg_fixture.get_br_phys_name())).bridge self.connect_to_central_network_via_vlans(self.br_phys) self.ovs_agent = self.useFixture( @@ -165,10 +165,6 @@ class Host(fixtures.Fixture): self.env_desc, self.host_desc, self.neutron_config.temp_dir, self.ovs_agent.agent_cfg_fixture.get_br_int_name())) - br_ex = self.useFixture( - net_helpers.OVSBridgeFixture( - self.l3_agent_cfg_fixture.get_external_bridge())).bridge - self.connect_to_central_network_via_vlans(br_ex) if self.host_desc.dhcp_agent: self.dhcp_agent_cfg_fixture = self.useFixture( diff --git a/neutron/tests/fullstack/test_l3_agent.py b/neutron/tests/fullstack/test_l3_agent.py index 9b7fc0c9196..f7f6a9c5bd9 100644 --- a/neutron/tests/fullstack/test_l3_agent.py +++ b/neutron/tests/fullstack/test_l3_agent.py @@ -25,7 +25,6 @@ from neutron.agent.l3 import namespaces from neutron.agent.linux import ip_lib from neutron.common import utils as common_utils from neutron.tests.common.exclusive_resources import ip_network -from neutron.tests.common import machine_fixtures from neutron.tests.fullstack import base from neutron.tests.fullstack.resources import environment from neutron.tests.fullstack.resources import machine @@ -80,10 +79,7 @@ class TestL3Agent(base.BaseFullStackTestCase): def _test_gateway_ip_changed(self): tenant_id = uuidutils.generate_uuid() ext_net, ext_sub = self._create_external_network_and_subnet(tenant_id) - external_vm = self.useFixture( - machine_fixtures.FakeMachine( - self.environment.central_bridge, - common_utils.ip_to_cidr(ext_sub['gateway_ip'], 24))) + external_vm = self._create_external_vm(ext_net, ext_sub) router = self.safe_client.create_router(tenant_id, external_network=ext_net['id']) @@ -209,10 +205,7 @@ class TestLegacyL3Agent(TestL3Agent): # 3. IPv6 ext connectivity: using ping6 from tenant vm to external_vm. tenant_id = uuidutils.generate_uuid() ext_net, ext_sub = self._create_external_network_and_subnet(tenant_id) - external_vm = self.useFixture( - machine_fixtures.FakeMachine( - self.environment.central_bridge, - common_utils.ip_to_cidr(ext_sub['gateway_ip'], 24))) + external_vm = self._create_external_vm(ext_net, ext_sub) # Create an IPv6 subnet in the external network v6network = self.useFixture( ip_network.ExclusiveIPNetwork( @@ -278,7 +271,7 @@ class TestHAL3Agent(TestL3Agent): for _ in range(2)] env = environment.Environment( environment.EnvironmentDescription( - network_type='vxlan', l2_pop=True), + network_type='vlan', l2_pop=True), host_descriptions) super(TestHAL3Agent, self).setUp(env) @@ -386,10 +379,7 @@ class TestHAL3Agent(TestL3Agent): router = self.safe_client.create_router(tenant_id, ha=True, external_network=ext_net['id']) - external_vm = self.useFixture( - machine_fixtures.FakeMachine( - self.environment.central_bridge, - common_utils.ip_to_cidr(ext_sub['gateway_ip'], 24))) + external_vm = self._create_external_vm(ext_net, ext_sub) common_utils.wait_until_true( lambda: diff --git a/neutron/tests/functional/agent/l3/framework.py b/neutron/tests/functional/agent/l3/framework.py index effe7a6f872..11a61423df5 100644 --- a/neutron/tests/functional/agent/l3/framework.py +++ b/neutron/tests/functional/agent/l3/framework.py @@ -79,9 +79,7 @@ class L3AgentTestFramework(base.BaseSudoTestCase): conf.set_override('interface_driver', self.INTERFACE_DRIVER) br_int = self.useFixture(net_helpers.OVSBridgeFixture()).bridge - br_ex = self.useFixture(net_helpers.OVSBridgeFixture()).bridge conf.set_override('ovs_integration_bridge', br_int.br_name) - conf.set_override('external_network_bridge', br_ex.br_name) temp_dir = self.get_new_temp_dir() get_temp_file_path = functools.partial(self.get_temp_file_path, @@ -542,13 +540,8 @@ class L3AgentTestFramework(base.BaseSudoTestCase): self.assertIn(extra_subnet, routes) def _assert_interfaces_deleted_from_ovs(self): - - def assert_ovs_bridge_empty(bridge_name): - bridge = ovs_lib.OVSBridge(bridge_name) - self.assertFalse(bridge.get_port_name_list()) - - assert_ovs_bridge_empty(self.agent.conf.ovs_integration_bridge) - assert_ovs_bridge_empty(self.agent.conf.external_network_bridge) + bridge = ovs_lib.OVSBridge(self.agent.conf.ovs_integration_bridge) + self.assertFalse(bridge.get_port_name_list()) def floating_ips_configured(self, router): floating_ips = router.router[constants.FLOATINGIP_KEY] @@ -594,7 +587,7 @@ class L3AgentTestFramework(base.BaseSudoTestCase): router1 = self._create_router(router_info, self.agent) self._add_fip(router1, '192.168.111.12') - r1_br = ip_lib.IPDevice(router1.driver.conf.external_network_bridge) + r1_br = ip_lib.IPDevice(router1.driver.conf.ovs_integration_bridge) r1_br.addr.add('19.4.4.1/24') r1_br.link.set_up() @@ -604,7 +597,7 @@ class L3AgentTestFramework(base.BaseSudoTestCase): mac='22:22:22:22:22:22')) router2 = self._create_router(router_info_2, self.failover_agent) - r2_br = ip_lib.IPDevice(router2.driver.conf.external_network_bridge) + r2_br = ip_lib.IPDevice(router2.driver.conf.ovs_integration_bridge) r2_br.addr.add('19.4.4.1/24') r2_br.link.set_up() @@ -642,12 +635,12 @@ class L3AgentTestFramework(base.BaseSudoTestCase): @staticmethod def fail_gw_router_port(router): - r_br = ip_lib.IPDevice(router.driver.conf.external_network_bridge) + r_br = ip_lib.IPDevice(router.driver.conf.ovs_integration_bridge) r_br.link.set_down() @staticmethod def restore_gw_router_port(router): - r_br = ip_lib.IPDevice(router.driver.conf.external_network_bridge) + r_br = ip_lib.IPDevice(router.driver.conf.ovs_integration_bridge) r_br.link.set_up() @classmethod diff --git a/neutron/tests/functional/agent/l3/test_dvr_router.py b/neutron/tests/functional/agent/l3/test_dvr_router.py index fd45f768c13..df67d0d16d1 100644 --- a/neutron/tests/functional/agent/l3/test_dvr_router.py +++ b/neutron/tests/functional/agent/l3/test_dvr_router.py @@ -148,9 +148,7 @@ class TestDvrRouter(framework.L3AgentTestFramework): self._validate_fips_for_external_network( router, router.fip_ns.get_name()) # Now delete the fg- port that was created - ext_net_bridge = self.agent.conf.external_network_bridge router.fip_ns.driver.unplug(fg_port_name, - bridge=ext_net_bridge, namespace=router.fip_ns.name, prefix=dvr_fip_ns.FIP_EXT_DEV_PREFIX) # Now check if the fg- port is missing. @@ -203,9 +201,7 @@ class TestDvrRouter(framework.L3AgentTestFramework): self._validate_fips_for_external_network( router, router.fip_ns.get_name()) # Now delete the fg- port that was created - ext_net_bridge = self.agent.conf.external_network_bridge router.fip_ns.driver.unplug(fg_port_name, - bridge=ext_net_bridge, namespace=router.fip_ns.name, prefix=dvr_fip_ns.FIP_EXT_DEV_PREFIX) # Now check if the fg- port is missing. @@ -1995,10 +1991,10 @@ class TestDvrRouter(framework.L3AgentTestFramework): fixed_ip_address_scope='scope2') router.process() - br_ex = framework.get_ovs_bridge( - self.agent.conf.external_network_bridge) + br_int = framework.get_ovs_bridge( + self.agent.conf.ovs_integration_bridge) src_machine = self.useFixture( - machine_fixtures.FakeMachine(br_ex, '19.4.4.12/24')) + machine_fixtures.FakeMachine(br_int, '19.4.4.12/24')) # Floating ip should work no matter of address scope net_helpers.assert_ping(src_machine.namespace, fip_same_scope) net_helpers.assert_ping(src_machine.namespace, fip_diff_scope) @@ -2010,11 +2006,11 @@ class TestDvrRouter(framework.L3AgentTestFramework): gw_port = router.get_ex_gw_port() gw_ip = self._port_first_ip_cidr(gw_port).partition('/')[0] - br_ex = framework.get_ovs_bridge( - self.agent.conf.external_network_bridge) + br_int = framework.get_ovs_bridge( + self.agent.conf.ovs_integration_bridge) src_machine = self.useFixture( - machine_fixtures.FakeMachine(br_ex, '19.4.4.12/24', gw_ip)) + machine_fixtures.FakeMachine(br_int, '19.4.4.12/24', gw_ip)) # For the internal networks that are in the same address scope as # external network, they can directly route to external network net_helpers.assert_ping(src_machine.namespace, machine_same_scope.ip) diff --git a/neutron/tests/functional/agent/l3/test_ha_router.py b/neutron/tests/functional/agent/l3/test_ha_router.py index ba2a90dc8f2..ba24abd198d 100644 --- a/neutron/tests/functional/agent/l3/test_ha_router.py +++ b/neutron/tests/functional/agent/l3/test_ha_router.py @@ -19,6 +19,7 @@ import mock from neutron_lib import constants import testtools +from neutron.agent.common import ovs_lib from neutron.agent.l3 import agent as neutron_l3_agent from neutron.agent.linux import ip_lib from neutron.common import ipv6_utils @@ -381,6 +382,28 @@ class L3HATestFailover(framework.L3AgentTestFramework): br_int_1.add_port(veth1.name) br_int_2.add_port(veth2.name) + @staticmethod + def fail_gw_router_port(router): + # NOTE(slaweq): in HA failover tests there are two integration bridges + # connected with veth pair to each other. To stop traffic from router's + # namespace to gw ip (19.4.4.1) it needs to be blocked by openflow rule + # as simple setting ovs_integration_bridge device DOWN will not be + # enough because same IP address is also configured on + # ovs_integration_bridge device from second router and it will still + # respond to ping + r_br = ovs_lib.OVSBridge(router.driver.conf.ovs_integration_bridge) + external_port = router.get_ex_gw_port() + for subnet in external_port['subnets']: + r_br.add_flow( + proto='ip', nw_dst=subnet['gateway_ip'], actions='drop') + + @staticmethod + def restore_gw_router_port(router): + r_br = ovs_lib.OVSBridge(router.driver.conf.ovs_integration_bridge) + external_port = router.get_ex_gw_port() + for subnet in external_port['subnets']: + r_br.delete_flows(proto='ip', nw_dst=subnet['gateway_ip']) + def test_ha_router_failover(self): router1, router2 = self.create_ha_routers() diff --git a/neutron/tests/functional/agent/l3/test_legacy_router.py b/neutron/tests/functional/agent/l3/test_legacy_router.py index e933ea809d5..d1af2c127e7 100644 --- a/neutron/tests/functional/agent/l3/test_legacy_router.py +++ b/neutron/tests/functional/agent/l3/test_legacy_router.py @@ -156,33 +156,6 @@ class L3AgentTestCase(framework.L3AgentTestFramework): self.addCleanup(bridge.destroy) return bridge - def test_external_network_bridge_change(self): - bridge1, bridge2 = self._make_bridge(), self._make_bridge() - self.agent.conf.set_override('external_network_bridge', - bridge1.br_name) - router_info = self.generate_router_info(False) - router = self.manage_router(self.agent, router_info) - gw_port = router.router['gw_port'] - gw_inf_name = router.get_external_device_name(gw_port['id']) - - self.assertIn(gw_inf_name, - [v.port_name for v in bridge1.get_vif_ports()]) - # changeing the external_network_bridge should have no impact since - # the interface exists. - self.agent.conf.set_override('external_network_bridge', - bridge2.br_name) - self.manage_router(self.agent, router_info) - self.assertIn(gw_inf_name, - [v.port_name for v in bridge1.get_vif_ports()]) - self.assertNotIn(gw_inf_name, - [v.port_name for v in bridge2.get_vif_ports()]) - namespaces.Namespace.delete(router.router_namespace) - self.manage_router(self.agent, router_info) - self.assertIn(gw_inf_name, - [v.port_name for v in bridge2.get_vif_ports()]) - self.assertNotIn(gw_inf_name, - [v.port_name for v in bridge1.get_vif_ports()]) - def test_legacy_router_ns_rebuild(self): router_info = self.generate_router_info(False) router = self.manage_router(self.agent, router_info) @@ -420,10 +393,10 @@ class L3AgentTestCase(framework.L3AgentTestFramework): fixed_ip_address_scope='scope2') router.process() - br_ex = framework.get_ovs_bridge( - self.agent.conf.external_network_bridge) + br_int = framework.get_ovs_bridge( + self.agent.conf.ovs_integration_bridge) src_machine = self.useFixture( - machine_fixtures.FakeMachine(br_ex, '19.4.4.12/24')) + machine_fixtures.FakeMachine(br_int, '19.4.4.12/24')) # Floating ip should work no matter of address scope net_helpers.assert_ping(src_machine.namespace, fip_same_scope) net_helpers.assert_ping(src_machine.namespace, fip_diff_scope) @@ -434,11 +407,11 @@ class L3AgentTestCase(framework.L3AgentTestFramework): gw_port = router.get_ex_gw_port() gw_ip = self._port_first_ip_cidr(gw_port).partition('/')[0] - br_ex = framework.get_ovs_bridge( - self.agent.conf.external_network_bridge) + br_int = framework.get_ovs_bridge( + self.agent.conf.ovs_integration_bridge) src_machine = self.useFixture( - machine_fixtures.FakeMachine(br_ex, '19.4.4.12/24', gw_ip)) + machine_fixtures.FakeMachine(br_int, '19.4.4.12/24', gw_ip)) # For the internal networks that are in the same address scope as # external network, they can directly route to external network net_helpers.assert_ping(src_machine.namespace, machine_same_scope.ip) diff --git a/neutron/tests/functional/cmd/test_ovs_cleanup.py b/neutron/tests/functional/cmd/test_ovs_cleanup.py index 2637fbace45..d28738b3bc5 100644 --- a/neutron/tests/functional/cmd/test_ovs_cleanup.py +++ b/neutron/tests/functional/cmd/test_ovs_cleanup.py @@ -34,26 +34,23 @@ class TestOVSCLIConfig(base.BaseOVSLinuxTestCase): def test_do_main_default_options(self): int_br = self.useFixture(net_helpers.OVSBridgeFixture()).bridge - ext_br = self.useFixture(net_helpers.OVSBridgeFixture()).bridge self.conf.set_override("ovs_integration_bridge", int_br.br_name) - self.conf.set_override("external_network_bridge", ext_br.br_name) self.conf.set_override("ovs_all_ports", False) noskip = collections.defaultdict(list) skip = collections.defaultdict(list) - # add two vifs, one skipped, and a non-vif port to int_br and ext_br - for br in (int_br, ext_br): - for collection in (noskip, skip): - collection[br].append( - self.useFixture(net_helpers.OVSPortFixture(br)).port.name) - # set skippable vif to be skipped - br.ovsdb.db_set( - 'Interface', skip[br][0], - ('external_ids', {constants.SKIP_CLEANUP: "True"}) - ).execute(check_error=True) - device_name = utils.get_rand_name() - skip[br].append(device_name) - br.add_port(device_name, ('type', 'internal')) + # add two vifs, one skipped, and a non-vif port to int_br + for collection in (noskip, skip): + collection[int_br].append( + self.useFixture(net_helpers.OVSPortFixture(int_br)).port.name) + # set skippable vif to be skipped + int_br.ovsdb.db_set( + 'Interface', skip[int_br][0], + ('external_ids', {constants.SKIP_CLEANUP: "True"}) + ).execute(check_error=True) + device_name = utils.get_rand_name() + skip[int_br].append(device_name) + int_br.add_port(device_name, ('type', 'internal')) # sanity check for collection in (noskip, skip): for bridge, ports in collection.items(): @@ -61,9 +58,8 @@ class TestOVSCLIConfig(base.BaseOVSLinuxTestCase): for port in ports: self.assertIn(port, port_list) ovs_cleanup.do_main(self.conf) - for br in (int_br, ext_br): - ports = br.get_port_name_list() - for vif in noskip[br]: - self.assertNotIn(vif, ports) - for port in skip[br]: - self.assertIn(port, ports) + ports = int_br.get_port_name_list() + for vif in noskip[int_br]: + self.assertNotIn(vif, ports) + for port in skip[int_br]: + self.assertIn(port, ports) diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index 30f151de88c..63b56cfe9df 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -750,7 +750,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): if not router.get('distributed'): self.mock_driver.unplug.assert_called_once_with( interface_name, - bridge=agent.conf.external_network_bridge, namespace=mock.ANY, prefix=mock.ANY) else: @@ -934,7 +933,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): # snat namespace was deleted self.mock_driver.unplug.assert_called_with( interface_name, - bridge=self.conf.external_network_bridge, namespace=snat_ns_name, prefix=namespaces.EXTERNAL_DEV_PREFIX) else: @@ -2107,6 +2105,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): ri.process = mock.Mock() ri.initialize = mock.Mock(side_effect=RuntimeError()) agent._create_router = mock.Mock(return_value=ri) + agent._fetch_external_net_id = mock.Mock( + return_value=router['external_gateway_info']['network_id']) agent._process_router_update() log_exception.assert_has_calls(calls) @@ -2355,7 +2355,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.mock_driver.unplug.assert_called_with( stale_devnames[0], - bridge="", namespace=ri.ns_name, prefix=namespaces.EXTERNAL_DEV_PREFIX) @@ -2376,7 +2375,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.mock_driver.unplug.assert_called_with( stale_devnames[0], - bridge=agent.conf.external_network_bridge, namespace=ri.snat_namespace.name, prefix=namespaces.EXTERNAL_DEV_PREFIX) @@ -2496,7 +2494,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): ns.delete() calls = [mock.call('qg-aaaa', - bridge=agent.conf.external_network_bridge, namespace=namespace, prefix=namespaces.EXTERNAL_DEV_PREFIX), mock.call('sg-aaaa', @@ -2725,7 +2722,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.assertFalse(chsfr.called) def test_process_router_if_compatible_with_no_ext_net_in_conf(self): - self.conf.set_override('external_network_bridge', 'br-ex') agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' @@ -2754,7 +2750,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.assertFalse(self.plugin_api.get_external_network_id.called) def test_process_router_if_compatible_with_stale_cached_ext_net(self): - self.conf.set_override('external_network_bridge', 'br-ex') agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' agent.target_ex_net_id = 'bbb' @@ -2770,7 +2765,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): agent.context) def test_process_router_if_compatible_w_no_ext_net_and_2_net_plugin(self): - self.conf.set_override('external_network_bridge', 'br-ex') agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) router = {'id': _uuid(), diff --git a/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py b/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py index f03f954de50..0abd3d4ef50 100644 --- a/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py +++ b/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py @@ -107,9 +107,6 @@ class TestDvrFipNs(base.BaseTestCase): self.fip_ns.create_or_update_gateway_port(agent_gw_port) self.assertTrue(fip_create.called) self.assertEqual(1, self.driver.plug.call_count) - ext_net_bridge = self.conf.external_network_bridge - if ext_net_bridge: - self.assertEqual(1, self.driver.remove_vlan_tag.call_count) self.assertEqual(1, self.driver.init_l3.call_count) interface_name = self.fip_ns.get_ext_device_name(agent_gw_port['id']) gw_cidrs = [sn['cidr'] for sn in agent_gw_port['subnets'] @@ -253,10 +250,8 @@ class TestDvrFipNs(base.BaseTestCase): exists.assert_called_once_with(self.fip_ns.name) delete.assert_called_once_with(self.fip_ns.name) - ext_net_bridge = self.conf.external_network_bridge ns_name = self.fip_ns.get_name() self.driver.unplug.assert_called_once_with('fg-aaaa', - bridge=ext_net_bridge, prefix='fg-', namespace=ns_name) ip_wrapper.del_veth.assert_called_once_with('fpr-aaaa') diff --git a/neutron/tests/unit/agent/l3/test_dvr_local_router.py b/neutron/tests/unit/agent/l3/test_dvr_local_router.py index 224799de0f1..0b7a86f6cd5 100644 --- a/neutron/tests/unit/agent/l3/test_dvr_local_router.py +++ b/neutron/tests/unit/agent/l3/test_dvr_local_router.py @@ -564,9 +564,9 @@ class TestDvrRouterOperations(base.BaseTestCase): 'foo_router_id', {'distributed': True, 'gw_port_host': HOSTNAME}) ri = dvr_router.DvrLocalRouter(HOSTNAME, **self.ri_kwargs) - with mock.patch.object(l3_agent.ip_lib, 'IPDevice') as f: - ri._update_arp_entry(mock.ANY, mock.ANY, 'foo_subnet_id', 'add') - self.assertFalse(f.call_count) + ri.get_internal_device_name = mock.Mock() + ri._update_arp_entry(mock.ANY, mock.ANY, 'foo_subnet_id', 'add') + self.assertFalse(ri.get_internal_device_name.call_count) def _setup_test_for_arp_entry_cache(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) @@ -581,7 +581,7 @@ class TestDvrRouterOperations(base.BaseTestCase): def test__update_arp_entry_calls_arp_cache_with_no_device(self): ri, subnet_id = self._setup_test_for_arp_entry_cache() state = True - with mock.patch.object(l3_agent.ip_lib, 'IPDevice') as rtrdev,\ + with mock.patch('neutron.agent.linux.ip_lib.IPDevice') as rtrdev,\ mock.patch.object(ri, '_cache_arp_entry') as arp_cache: rtrdev.return_value.exists.return_value = False state = ri._update_arp_entry( diff --git a/neutron/tests/unit/debug/test_commands.py b/neutron/tests/unit/debug/test_commands.py index 07e292565be..09eace5008e 100644 --- a/neutron/tests/unit/debug/test_commands.py +++ b/neutron/tests/unit/debug/test_commands.py @@ -37,7 +37,6 @@ class TestDebugCommands(base.BaseTestCase): def setUp(self): super(TestDebugCommands, self).setUp() config.register_interface_opts() - cfg.CONF.register_opts(config.EXT_NET_BRIDGE_OPTS) common_config.init([]) config.register_interface_driver_opts_helper(cfg.CONF) @@ -132,7 +131,6 @@ class TestDebugCommands(base.BaseTestCase): 'fake_port', 'tap12345678-12', 'aa:bb:cc:dd:ee:ffa', - bridge=None, namespace=namespace), mock.call.init_l3('tap12345678-12', ['10.0.0.3/24'], @@ -177,7 +175,6 @@ class TestDebugCommands(base.BaseTestCase): 'fake_port', 'tap12345678-12', 'aa:bb:cc:dd:ee:ffa', - bridge='', namespace=namespace), mock.call.init_l3('tap12345678-12', ['10.0.0.3/24'], @@ -200,13 +197,10 @@ class TestDebugCommands(base.BaseTestCase): cmd.run(parsed_args) namespace = 'qprobe-fake_port' self.client.assert_has_calls([mock.call.show_port('fake_port'), - mock.call.show_network('fake_net'), - mock.call.show_subnet('fake_subnet'), mock.call.delete_port('fake_port')]) self.driver.assert_has_calls([mock.call.get_device_name(mock.ANY), mock.call.unplug('tap12345678-12', - namespace=namespace, - bridge=None)]) + namespace=namespace)]) def test_delete_probe_external(self): fake_network = {'network': {'id': 'fake_net', @@ -221,13 +215,10 @@ class TestDebugCommands(base.BaseTestCase): cmd.run(parsed_args) namespace = 'qprobe-fake_port' self.client.assert_has_calls([mock.call.show_port('fake_port'), - mock.call.show_network('fake_net'), - mock.call.show_subnet('fake_subnet'), mock.call.delete_port('fake_port')]) self.driver.assert_has_calls([mock.call.get_device_name(mock.ANY), mock.call.unplug('tap12345678-12', - namespace=namespace, - bridge='')]) + namespace=namespace)]) def test_list_probe(self): cmd = commands.ListProbe(self.app, None) @@ -263,13 +254,10 @@ class TestDebugCommands(base.BaseTestCase): device_owner=[debug_agent.DEVICE_OWNER_NETWORK_PROBE, debug_agent.DEVICE_OWNER_COMPUTE_PROBE]), mock.call.show_port('fake_port'), - mock.call.show_network('fake_net'), - mock.call.show_subnet('fake_subnet'), mock.call.delete_port('fake_port')]) self.driver.assert_has_calls([mock.call.get_device_name(mock.ANY), mock.call.unplug('tap12345678-12', - namespace=namespace, - bridge=None)]) + namespace=namespace)]) def test_ping_all_with_ensure_port(self): fake_ports = self.fake_ports diff --git a/neutron/tests/unit/extensions/test_l3.py b/neutron/tests/unit/extensions/test_l3.py index 3263e3ba662..e46cfdb6d93 100644 --- a/neutron/tests/unit/extensions/test_l3.py +++ b/neutron/tests/unit/extensions/test_l3.py @@ -4111,8 +4111,7 @@ class L3NatDBIntAgentSchedulingTestCase(L3BaseForIntTests, host='host1', ext_net_id=s1['subnet']['network_id']) helpers.register_l3_agent( - host='host2', internal_only=False, - ext_net_id='', ext_bridge='') + host='host2', internal_only=False, ext_net_id='') l3_rpc_cb.get_router_ids(self.adminContext, host='host1') self._assert_router_on_agent(r['router']['id'], 'host1') diff --git a/releasenotes/notes/external_network_bridge-option-removed-bbf50fb803f04f82.yaml b/releasenotes/notes/external_network_bridge-option-removed-bbf50fb803f04f82.yaml new file mode 100644 index 00000000000..d69b2ff5703 --- /dev/null +++ b/releasenotes/notes/external_network_bridge-option-removed-bbf50fb803f04f82.yaml @@ -0,0 +1,6 @@ +--- +upgrade: + - The ``external_network_bridge`` config option has been removed. + Existing users of this option will now have their router's gateway + interface created in the integration bridge and it will be wired by + the L2 agent.