From 2bb52d49bec299f070a513fee6f9f7ae5d53118b Mon Sep 17 00:00:00 2001 From: Li YaJie Date: Mon, 22 Mar 2021 10:01:22 +0800 Subject: [PATCH] Call install_ingress_direct_goto_flows() when ovs restarts When ovs restarts and needs to regenerate flows, some flows will be missing in br-int, as follows: * table=60,priority=4,in_port="int-br-floating" actions=resubmit(,61) * table=60,priority=4,in_port="patch-tun" actions=resubmit(,61) * table=61,priority=0 actions=resubmit(,62) Call install_ingress_direct_goto_flows() again in the _handle_ovs_restart() to ensure generate these flows. Change-Id: I240a78879db757592df138a53b2c22d7f5a9ae13 Closes-Bug: #1920700 --- .../openvswitch/agent/ovs_neutron_agent.py | 1 + .../openvswitch/agent/test_ovs_neutron_agent.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py index 8becbb6c166..2c209bd387e 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -2522,6 +2522,7 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, def _handle_ovs_restart(self, polling_manager): self.setup_integration_br() + self.install_ingress_direct_goto_flows() self.setup_physical_bridges(self.bridge_mappings) if self.enable_tunneling: self._reset_tunnel_ofports() diff --git a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py index 5c119f86f6f..c368d5971f2 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py @@ -2327,6 +2327,23 @@ class TestOvsNeutronAgent(object): self._test_ovs_status(constants.OVS_NORMAL, constants.OVS_RESTARTED) + def test_ovs_restart_for_ingress_direct_goto_flows(self): + with mock.patch.object(self.agent, + 'check_ovs_status', + return_value=constants.OVS_RESTARTED), \ + mock.patch.object(self.agent, + '_agent_has_updates', + side_effect=TypeError('loop exit')), \ + mock.patch.object(self.agent, 'setup_integration_br'), \ + mock.patch.object(self.agent, + 'install_ingress_direct_goto_flows') as \ + install_ingress_direct_goto_flows: + try: + self.agent.rpc_loop(polling_manager=mock.Mock()) + except TypeError: + pass + install_ingress_direct_goto_flows.assert_called_once_with() + def test_rpc_loop_fail_to_process_network_ports_keep_flows(self): with mock.patch.object(async_process.AsyncProcess, "_spawn"),\ mock.patch.object(async_process.AsyncProcess, "start"),\