ofagent: Fix port_dead

Remove relevant flows on port_dead, so that it correctly
stops forwarding packets to/from admin_state_up=False ports.

Revealed by tempest test_update_instance_port_admin_state test case.

While i'm here, update docstring of port_dead.

(cherry-picked from networking-ofagent 92c9f3339811f332c89fc6e739f13a1a8fe733d1)
Closes-Bug: #1421098
Change-Id: I70ac46f77ed3f9fcfdb051abb4a5f09b81fb61b8
This commit is contained in:
YAMAMOTO Takashi 2015-02-10 13:17:50 +09:00 committed by fumihiko kakuma
parent 9ff5bb9671
commit 3abee3bcfd
2 changed files with 33 additions and 5 deletions

View File

@ -585,12 +585,21 @@ class OFANeutronAgent(n_rpc.RpcCallback,
return
self.int_br.local_out_delete_port(lvm.vlan, port.vif_mac)
def port_dead(self, port):
"""Once a port has no binding, put it on the "dead vlan".
def port_dead(self, port, net_uuid=None):
"""Try to stop forwarding on the port.
:param port: a ovs_lib.VifPort object.
:param port: a ports.OFPort object.
:param net_uuid: network uuid to which the port belongs to.
None if unknown.
"""
pass
self.int_br.check_in_port_delete_port(port.ofport)
if port.vif_mac is None:
return
if net_uuid is None:
return
lvm = self.local_vlan_map.get(net_uuid)
if lvm is not None:
self.int_br.local_out_delete_port(lvm.vlan, port.vif_mac)
def setup_integration_br(self):
"""Setup the integration bridge.
@ -721,7 +730,7 @@ class OFANeutronAgent(n_rpc.RpcCallback,
self.port_bound(vif_port, network_id, network_type,
physical_network, segmentation_id)
else:
self.port_dead(vif_port)
self.port_dead(vif_port, network_id)
else:
LOG.debug("No VIF port for port %s defined on agent.", port_id)

View File

@ -841,3 +841,22 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
result = self.agent._get_ofport_names('hoge')
_get_ports.assert_called_once_with('hoge')
self.assertEqual(set(names), result)
def test_port_dead(self):
net = "539b161f-b31a-11e4-8c19-08606e7f74e7"
mac = "08:60:6e:7f:74:e7"
ofport = 111
vlan = 99
port = mock.Mock()
port.ofport = ofport
port.vif_mac = mac
lvm = mock.Mock()
lvm.vlan = vlan
self.agent.local_vlan_map[net] = lvm
with contextlib.nested(
mock.patch.object(self.agent.int_br, 'check_in_port_delete_port'),
mock.patch.object(self.agent.int_br, 'local_out_delete_port'),
) as (check_in_port_delete_port, local_out_delete_port):
self.agent.port_dead(port, net_uuid=net)
check_in_port_delete_port.assert_called_once_with(ofport)
local_out_delete_port.assert_called_once_with(vlan, mac)