From 53ec63c430d123cd1ed4acd3b94537e9cb380bcd Mon Sep 17 00:00:00 2001 From: Romil Gupta Date: Thu, 4 Jun 2015 04:21:14 -0700 Subject: [PATCH] Fix a regression in "Separate ovs-ofctl using code as a driver" change The tunnels are not getting established between Network Node and Compute Nodes in non DVR mode with l2pop enabled and throws the AttributeError: add_tunnel_port. This fixes a regression in change Ie1224f8a1c17268cd7d1c474ed82fdfb8852eaa8. Co-Authored-By: YAMAMOTO Takashi Closes-Bug: #1461486 Change-Id: I1106fd3dd32f6f827eb25dec4815ff1120af96f0 --- .../agent/openflow/ovs_ofctl/br_tun.py | 20 +++++--- .../agent/openflow/ovs_ofctl/test_br_tun.py | 51 +++++++++++++++++++ 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py b/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py index 58301dfef..eeaf6ee8f 100644 --- a/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py +++ b/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py @@ -203,14 +203,16 @@ class OVSTunnelBridge(ovs_bridge.OVSAgentBridge, dl_vlan=vlan, nw_dst='%s' % ip) - def setup_tunnel_port(self, network_type, port): - self.add_flow(priority=1, - in_port=port, - actions="resubmit(,%s)" % - constants.TUN_TABLE[network_type]) + def setup_tunnel_port(self, network_type, port, deferred_br=None): + br = deferred_br if deferred_br else self + br.add_flow(priority=1, + in_port=port, + actions="resubmit(,%s)" % + constants.TUN_TABLE[network_type]) - def cleanup_tunnel_port(self, port): - self.delete_flows(in_port=port) + def cleanup_tunnel_port(self, port, deferred_br=None): + br = deferred_br if deferred_br else self + br.delete_flows(in_port=port) def add_dvr_mac_tun(self, mac, port): # Table DVR_NOT_LEARN ensures unique dvr macs in the cloud @@ -237,10 +239,12 @@ class DeferredOVSTunnelBridge(ovs_lib.DeferredOVSBridge): 'delete_flood_to_tun', 'install_arp_responder', 'delete_arp_responder', + 'setup_tunnel_port', + 'cleanup_tunnel_port', ] def __getattr__(self, name): if name in self._METHODS: m = getattr(self.br, name) return functools.partial(m, deferred_br=self) - raise AttributeError(name) + return super(DeferredOVSTunnelBridge, self).__getattr__(name) diff --git a/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py b/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py index 27a046d0a..1a6ac5816 100644 --- a/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py +++ b/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py @@ -257,3 +257,54 @@ class OVSTunnelBridgeTest(ovs_bridge_test_base.OVSBridgeTestBase, call.delete_flows(eth_src=mac, table_id=9), ] self.assertEqual(expected, self.mock.mock_calls) + + def _mock_add_tunnel_port(self, deferred_br=False): + port_name = 'fake_port' + remote_ip = '192.168.1.3' + local_ip = '192.168.1.2' + tunnel_type = 'vxlan' + vxlan_udp_port = '4789' + dont_fragment = True + if deferred_br: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.add_port', + return_value=9999) as add_port, \ + self.br.deferred() as deferred_br: + ofport = deferred_br.add_tunnel_port(port_name, remote_ip, + local_ip, tunnel_type, + vxlan_udp_port, + dont_fragment) + else: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.add_port', + return_value=9999) as add_port: + ofport = self.br.add_tunnel_port(port_name, remote_ip, + local_ip, tunnel_type, + vxlan_udp_port, + dont_fragment) + self.assertEqual(9999, ofport) + self.assertEqual(1, add_port.call_count) + self.assertEqual(port_name, add_port.call_args[0][0]) + + def _mock_delete_port(self, deferred_br=False): + port_name = 'fake_port' + if deferred_br: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.' + 'delete_port') as delete_port, \ + self.br.deferred() as deferred_br: + deferred_br.delete_port(port_name) + else: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.' + 'delete_port') as delete_port: + self.br.delete_port(port_name) + self.assertEqual([call(port_name)], delete_port.mock_calls) + + def test_add_tunnel_port(self): + self._mock_add_tunnel_port() + + def test_delete_port(self): + self._mock_delete_port() + + def test_deferred_br_add_tunnel_port(self): + self._mock_add_tunnel_port(True) + + def test_deferred_br_delete_port(self): + self._mock_delete_port(True) -- 2.45.2