from neutron.agent import l2population_rpc
from neutron.agent.linux import ip_lib
from neutron.agent.linux import ovs_lib
-from neutron.agent.linux import utils
from neutron.agent import rpc as agent_rpc
from neutron.agent import securitygroups_rpc as sg_rpc
from neutron.common import constants as n_const
def __init__(self, ryuapp, integ_br, local_ip,
bridge_mappings, interface_mappings, root_helper,
- polling_interval, tunnel_types=None,
- veth_mtu=None):
+ polling_interval, tunnel_types=None):
"""Constructor.
:param ryuapp: object of the ryu app.
:param tunnel_types: A list of tunnel types to enable support for in
the agent. If set, will automatically set enable_tunneling to
True.
- :param veth_mtu: MTU size for veth interfaces.
"""
super(OFANeutronAgent, self).__init__()
self.ryuapp = ryuapp
- self.veth_mtu = veth_mtu
self.root_helper = root_helper
# TODO(yamamoto): Remove this VLAN leftover
self.available_local_vlans = set(xrange(ofa_const.LOCAL_VLAN_MIN,
self.setup_integration_br()
self.int_ofports = {}
self.setup_physical_interfaces(interface_mappings)
- # TODO(yamamoto): Remove physical bridge support
- self.setup_physical_bridges(bridge_mappings)
self.local_vlan_map = {}
self.tun_ofports = {}
for t in tables.TUNNEL_TYPES:
br.setup_ofp()
br.setup_default_table()
- def _phys_br_prepare_create_veth(self, br, int_veth_name, phys_veth_name):
- self.int_br.delete_port(int_veth_name)
- br.delete_port(phys_veth_name)
- if ip_lib.device_exists(int_veth_name, self.root_helper):
- ip_lib.IPDevice(int_veth_name, self.root_helper).link.delete()
- # Give udev a chance to process its rules here, to avoid
- # race conditions between commands launched by udev rules
- # and the subsequent call to ip_wrapper.add_veth
- utils.execute(['udevadm', 'settle', '--timeout=10'])
-
- def _phys_br_create_veth(self, br, int_veth_name,
- phys_veth_name, physical_network, ip_wrapper):
- int_veth, phys_veth = ip_wrapper.add_veth(int_veth_name,
- phys_veth_name)
- int_br = self.int_br
- self.int_ofports[physical_network] = int(int_br.add_port(int_veth))
- self.phys_ofports[physical_network] = int(br.add_port(phys_veth))
- return (int_veth, phys_veth)
-
- def _phys_br_enable_veth_to_pass_traffic(self, int_veth, phys_veth):
- # enable veth to pass traffic
- int_veth.link.set_up()
- phys_veth.link.set_up()
-
- if self.veth_mtu:
- # set up mtu size for veth interfaces
- int_veth.link.set_mtu(self.veth_mtu)
- phys_veth.link.set_mtu(self.veth_mtu)
-
- def _phys_br_patch_physical_bridge_with_integration_bridge(
- self, br, physical_network, bridge, ip_wrapper):
- int_veth_name = constants.PEER_INTEGRATION_PREFIX + bridge
- phys_veth_name = constants.PEER_PHYSICAL_PREFIX + bridge
- self._phys_br_prepare_create_veth(br, int_veth_name, phys_veth_name)
- int_veth, phys_veth = self._phys_br_create_veth(br, int_veth_name,
- phys_veth_name,
- physical_network,
- ip_wrapper)
- self._phys_br_enable_veth_to_pass_traffic(int_veth, phys_veth)
-
- def setup_physical_bridges(self, bridge_mappings):
- """Setup the physical network bridges.
-
- Creates physical network bridges and links them to the
- integration bridge using veths.
-
- :param bridge_mappings: map physical network names to bridge names.
- """
- self.phys_brs = {}
- self.phys_ofports = {}
- ip_wrapper = ip_lib.IPWrapper(self.root_helper)
- for physical_network, bridge in bridge_mappings.iteritems():
- LOG.info(_LI("Mapping physical network %(physical_network)s to "
- "bridge %(bridge)s"),
- {'physical_network': physical_network,
- 'bridge': bridge})
- # setup physical bridge
- if not ip_lib.device_exists(bridge, self.root_helper):
- LOG.error(_LE("Bridge %(bridge)s for physical network "
- "%(physical_network)s does not exist. Agent "
- "terminated!"),
- {'physical_network': physical_network,
- 'bridge': bridge})
- raise SystemExit(1)
- br = Bridge(bridge, self.root_helper, self.ryuapp)
- self.phys_brs[physical_network] = br
-
- self._phys_br_patch_physical_bridge_with_integration_bridge(
- br, physical_network, bridge, ip_wrapper)
-
def setup_physical_interfaces(self, interface_mappings):
"""Setup the physical network interfaces.
root_helper=config.AGENT.root_helper,
polling_interval=config.AGENT.polling_interval,
tunnel_types=config.AGENT.tunnel_types,
- veth_mtu=config.AGENT.veth_mtu,
)
# If enable_tunneling is TRUE, set tunnel_type to default to GRE
from oslo.config import cfg
import testtools
-from neutron.agent.linux import ip_lib
-from neutron.agent.linux import utils
from neutron.common import constants as n_const
from neutron.openstack.common import importutils
from neutron.plugins.common import constants as p_const
self.int_dp = self._mk_test_dp('int_br')
self.agent.int_br = self._mk_test_br('int_br')
self.agent.int_br.set_dp(self.int_dp)
- self.agent.phys_brs['phys-net1'] = self._mk_test_br('phys_br1')
- self.agent.phys_ofports['phys-net1'] = 777
self.agent.int_ofports['phys-net1'] = 666
- self.datapath = self._mk_test_dp('phys_br')
def _create_tunnel_port_name(self, tunnel_ip, tunnel_type):
tunnel_ip_hex = '%08x' % netaddr.IPAddress(tunnel_ip, version=4)
physical_network="physnet")
self.assertEqual(set(['tapb1981919-f5']), self.agent.updated_ports)
- def test_setup_physical_bridges(self):
- with contextlib.nested(
- mock.patch.object(ip_lib, "device_exists"),
- mock.patch.object(utils, "execute"),
- mock.patch.object(self.mod_agent.Bridge, "add_port"),
- mock.patch.object(self.mod_agent.Bridge, "delete_port"),
- mock.patch.object(self.mod_agent.Bridge, "set_protocols"),
- mock.patch.object(self.mod_agent.Bridge, "set_controller"),
- mock.patch.object(self.mod_agent.Bridge, "get_datapath_id",
- return_value='0xa'),
- mock.patch.object(self.agent.int_br, "add_port"),
- mock.patch.object(self.agent.int_br, "delete_port"),
- mock.patch.object(ip_lib.IPWrapper, "add_veth"),
- mock.patch.object(ip_lib.IpLinkCommand, "delete"),
- mock.patch.object(ip_lib.IpLinkCommand, "set_up"),
- mock.patch.object(ip_lib.IpLinkCommand, "set_mtu"),
- mock.patch.object(self.mod_agent.ryu_api, "get_datapath",
- return_value=self.datapath)
- ) as (devex_fn, utilsexec_fn,
- ovs_addport_fn, ovs_delport_fn, ovs_set_protocols_fn,
- ovs_set_controller_fn, ovs_datapath_id_fn, br_addport_fn,
- br_delport_fn, addveth_fn, linkdel_fn, linkset_fn, linkmtu_fn,
- ryu_api_fn):
- devex_fn.return_value = True
- parent = mock.MagicMock()
- parent.attach_mock(utilsexec_fn, 'utils_execute')
- parent.attach_mock(linkdel_fn, 'link_delete')
- parent.attach_mock(addveth_fn, 'add_veth')
- addveth_fn.return_value = (ip_lib.IPDevice("int-br-eth1"),
- ip_lib.IPDevice("phy-br-eth1"))
- ovs_addport_fn.return_value = "25"
- br_addport_fn.return_value = "11"
- self.agent.setup_physical_bridges({"physnet1": "br-eth"})
- expected_calls = [mock.call.link_delete(),
- mock.call.utils_execute(['udevadm',
- 'settle',
- '--timeout=10']),
- mock.call.add_veth('int-br-eth',
- 'phy-br-eth')]
- parent.assert_has_calls(expected_calls, any_order=False)
- self.assertEqual(11, self.agent.int_ofports["physnet1"])
- self.assertEqual(25, self.agent.phys_ofports["physnet1"])
-
def test_setup_physical_interfaces(self):
with mock.patch.object(self.agent.int_br, "add_port") as add_port_fn:
add_port_fn.return_value = "111"