Merge "ofagent: Local arp responder for VLAN"
This commit is contained in:
commit
213ad578b3
@ -223,6 +223,8 @@ class OFANeutronAgent(n_rpc.RpcCallback,
|
||||
self.available_local_vlans = set(xrange(ofa_const.LOCAL_VLAN_MIN,
|
||||
ofa_const.LOCAL_VLAN_MAX))
|
||||
self.tunnel_types = tunnel_types or []
|
||||
l2pop_network_types = list(set(self.tunnel_types +
|
||||
[p_const.TYPE_VLAN]))
|
||||
self.agent_state = {
|
||||
'binary': 'neutron-ofa-agent',
|
||||
'host': cfg.CONF.host,
|
||||
@ -230,7 +232,8 @@ class OFANeutronAgent(n_rpc.RpcCallback,
|
||||
'configurations': {'bridge_mappings': bridge_mappings,
|
||||
'tunnel_types': self.tunnel_types,
|
||||
'tunneling_ip': local_ip,
|
||||
'l2_population': True},
|
||||
'l2_population': True,
|
||||
'l2pop_network_types': l2pop_network_types},
|
||||
'agent_type': n_const.AGENT_TYPE_OFA,
|
||||
'start_flag': True}
|
||||
|
||||
@ -340,23 +343,29 @@ class OFANeutronAgent(n_rpc.RpcCallback,
|
||||
LOG.debug("fdb_add received")
|
||||
for lvm, agent_ports in self.get_agent_ports(fdb_entries,
|
||||
self.local_vlan_map):
|
||||
local = agent_ports.pop(self.local_ip, None)
|
||||
if local:
|
||||
self._fdb_add_arp(lvm, {self.local_ip: local})
|
||||
if len(agent_ports):
|
||||
self.fdb_add_tun(context, self.int_br, lvm, agent_ports,
|
||||
self.tun_ofports)
|
||||
if lvm.network_type in self.tunnel_types:
|
||||
local = agent_ports.pop(self.local_ip, None)
|
||||
if local:
|
||||
self._fdb_add_arp(lvm, {self.local_ip: local})
|
||||
if len(agent_ports):
|
||||
self.fdb_add_tun(context, self.int_br, lvm, agent_ports,
|
||||
self.tun_ofports)
|
||||
else:
|
||||
self._fdb_add_arp(lvm, agent_ports)
|
||||
|
||||
def fdb_remove(self, context, fdb_entries):
|
||||
LOG.debug("fdb_remove received")
|
||||
for lvm, agent_ports in self.get_agent_ports(fdb_entries,
|
||||
self.local_vlan_map):
|
||||
local = agent_ports.pop(self.local_ip, None)
|
||||
if local:
|
||||
self._fdb_remove_arp(lvm, {self.local_ip: local})
|
||||
if len(agent_ports):
|
||||
self.fdb_remove_tun(context, self.int_br, lvm, agent_ports,
|
||||
self.tun_ofports)
|
||||
if lvm.network_type in self.tunnel_types:
|
||||
local = agent_ports.pop(self.local_ip, None)
|
||||
if local:
|
||||
self._fdb_remove_arp(lvm, {self.local_ip: local})
|
||||
if len(agent_ports):
|
||||
self.fdb_remove_tun(context, self.int_br, lvm, agent_ports,
|
||||
self.tun_ofports)
|
||||
else:
|
||||
self._fdb_remove_arp(lvm, agent_ports)
|
||||
|
||||
@log.log
|
||||
def _fdb_add_arp(self, lvm, agent_ports):
|
||||
|
@ -504,7 +504,7 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
|
||||
self.agent.port_unbound("vif1")
|
||||
self.assertTrue(reclvl_fn.called)
|
||||
|
||||
def _prepare_l2_pop_ofports(self):
|
||||
def _prepare_l2_pop_ofports(self, network_type=None):
|
||||
LVM = collections.namedtuple('LVM', 'net, vlan, segid, ip')
|
||||
self.lvms = [LVM(net='net1', vlan=11, segid=21, ip='1.1.1.1'),
|
||||
LVM(net='net2', vlan=12, segid=22, ip='2.2.2.2')]
|
||||
@ -513,16 +513,19 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
|
||||
self.tunnel_type)
|
||||
self.tun_name2 = self._create_tunnel_port_name(self.lvms[1].ip,
|
||||
self.tunnel_type)
|
||||
if network_type is None:
|
||||
network_type = self.tunnel_type
|
||||
lvm1 = mock.Mock()
|
||||
lvm1.network_type = self.tunnel_type
|
||||
lvm1.network_type = network_type
|
||||
lvm1.vlan = self.lvms[0].vlan
|
||||
lvm1.segmentation_id = self.lvms[0].segid
|
||||
lvm1.tun_ofports = set([1])
|
||||
lvm2 = mock.Mock()
|
||||
lvm2.network_type = self.tunnel_type
|
||||
lvm2.network_type = network_type
|
||||
lvm2.vlan = self.lvms[1].vlan
|
||||
lvm2.segmentation_id = self.lvms[1].segid
|
||||
lvm2.tun_ofports = set([1, 2])
|
||||
self.agent.tunnel_types = [self.tunnel_type]
|
||||
self.agent.local_vlan_map = {self.lvms[0].net: lvm1,
|
||||
self.lvms[1].net: lvm2}
|
||||
self.agent.tun_ofports = {self.tunnel_type:
|
||||
@ -637,9 +640,13 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
|
||||
fdb_entry = {self.lvms[0].net:
|
||||
{'network_type': self.tunnel_type,
|
||||
'segment_id': 'tun1',
|
||||
'ports': {self.lvms[0].ip: [['mac1', 'ip1']],
|
||||
self.lvms[1].ip: [['mac2', 'ip2']]}}}
|
||||
with mock.patch.object(self.agent, 'setup_tunnel_port'):
|
||||
'ports': {self.lvms[0].ip: [n_const.FLOODING_ENTRY,
|
||||
['mac1', 'ip1']],
|
||||
self.lvms[1].ip: [['mac2', 'ip2']],
|
||||
'192.0.2.1': [n_const.FLOODING_ENTRY,
|
||||
['mac3', 'ip3']]}}}
|
||||
with mock.patch.object(self.agent,
|
||||
'setup_tunnel_port') as setup_tun_fn:
|
||||
self.agent.fdb_add(None, fdb_entry)
|
||||
calls = [
|
||||
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
|
||||
@ -648,15 +655,46 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
|
||||
'ip2', 'mac2')
|
||||
]
|
||||
self.ryuapp.add_arp_table_entry.assert_has_calls(calls)
|
||||
setup_tun_fn.assert_called_once_with(self.agent.int_br,
|
||||
'192.0.2.1', 'gre')
|
||||
|
||||
def _test_add_arp_table_entry_non_tunnel(self, network_type):
|
||||
self._prepare_l2_pop_ofports(network_type=network_type)
|
||||
fdb_entry = {self.lvms[0].net:
|
||||
{'network_type': network_type,
|
||||
'segment_id': 'tun1',
|
||||
'ports': {self.lvms[0].ip: [n_const.FLOODING_ENTRY,
|
||||
['mac1', 'ip1']],
|
||||
self.lvms[1].ip: [['mac2', 'ip2']],
|
||||
'192.0.2.1': [n_const.FLOODING_ENTRY,
|
||||
['mac3', 'ip3']]}}}
|
||||
with mock.patch.object(self.agent,
|
||||
'setup_tunnel_port') as setup_tun_fn:
|
||||
self.agent.fdb_add(None, fdb_entry)
|
||||
calls = [
|
||||
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
|
||||
'ip1', 'mac1'),
|
||||
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
|
||||
'ip2', 'mac2')
|
||||
]
|
||||
self.ryuapp.add_arp_table_entry.assert_has_calls(calls)
|
||||
self.assertFalse(setup_tun_fn.called)
|
||||
|
||||
def test_add_arp_table_entry_vlan(self):
|
||||
self._test_add_arp_table_entry_non_tunnel('vlan')
|
||||
|
||||
def test_del_arp_table_entry(self):
|
||||
self._prepare_l2_pop_ofports()
|
||||
fdb_entry = {self.lvms[0].net:
|
||||
{'network_type': self.tunnel_type,
|
||||
'segment_id': 'tun1',
|
||||
'ports': {self.lvms[0].ip: [['mac1', 'ip1']],
|
||||
self.lvms[1].ip: [['mac2', 'ip2']]}}}
|
||||
with mock.patch.object(self.agent, 'cleanup_tunnel_port'):
|
||||
'ports': {self.lvms[0].ip: [n_const.FLOODING_ENTRY,
|
||||
['mac1', 'ip1']],
|
||||
self.lvms[1].ip: [['mac2', 'ip2']],
|
||||
'192.0.2.1': [n_const.FLOODING_ENTRY,
|
||||
['mac3', 'ip3']]}}}
|
||||
with mock.patch.object(self.agent,
|
||||
'cleanup_tunnel_port') as cleanup_tun_fn:
|
||||
self.agent.fdb_remove(None, fdb_entry)
|
||||
calls = [
|
||||
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
|
||||
@ -665,6 +703,32 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
|
||||
'ip2')
|
||||
]
|
||||
self.ryuapp.del_arp_table_entry.assert_has_calls(calls)
|
||||
cleanup_tun_fn.assert_called_once_with(self.agent.int_br, 1, 'gre')
|
||||
|
||||
def _test_del_arp_table_entry_non_tunnel(self, network_type):
|
||||
self._prepare_l2_pop_ofports(network_type=network_type)
|
||||
fdb_entry = {self.lvms[0].net:
|
||||
{'network_type': network_type,
|
||||
'segment_id': 'tun1',
|
||||
'ports': {self.lvms[0].ip: [n_const.FLOODING_ENTRY,
|
||||
['mac1', 'ip1']],
|
||||
self.lvms[1].ip: [['mac2', 'ip2']],
|
||||
'192.0.2.1': [n_const.FLOODING_ENTRY,
|
||||
['mac3', 'ip3']]}}}
|
||||
with mock.patch.object(self.agent,
|
||||
'cleanup_tunnel_port') as cleanup_tun_fn:
|
||||
self.agent.fdb_remove(None, fdb_entry)
|
||||
calls = [
|
||||
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
|
||||
'ip1'),
|
||||
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
|
||||
'ip2')
|
||||
]
|
||||
self.ryuapp.del_arp_table_entry.assert_has_calls(calls)
|
||||
self.assertFalse(cleanup_tun_fn.called)
|
||||
|
||||
def test_del_arp_table_entry_vlan(self):
|
||||
self._test_del_arp_table_entry_non_tunnel('vlan')
|
||||
|
||||
def test_recl_lv_port_to_preserve(self):
|
||||
self._prepare_l2_pop_ofports()
|
||||
|
Loading…
x
Reference in New Issue
Block a user