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 2773f01ae8b..ff8c2e93266 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -1954,6 +1954,35 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, ancillary_devices_not_to_retry) return new_failed_devices_retries_map + def _handle_ovs_restart(self, polling_manager): + self.setup_integration_br() + self.setup_physical_bridges(self.bridge_mappings) + if self.enable_tunneling: + self._reset_tunnel_ofports() + self.setup_tunnel_br() + self.setup_tunnel_br_flows() + if self.enable_distributed_routing: + self.dvr_agent.reset_ovs_parameters(self.int_br, + self.tun_br, + self.patch_int_ofport, + self.patch_tun_ofport) + self.dvr_agent.reset_dvr_parameters() + self.dvr_agent.setup_dvr_flows() + # notify that OVS has restarted + registry.notify( + callback_resources.AGENT, + callback_events.OVS_RESTARTED, + self) + # restart the polling manager so that it will signal as added + # all the current ports + # REVISIT (rossella_s) Define a method "reset" in + # BasePollingManager that will be implemented by AlwaysPoll as + # no action and by InterfacePollingMinimizer as start/stop + if isinstance( + polling_manager, polling.InterfacePollingMinimizer): + polling_manager.stop() + polling_manager.start() + def rpc_loop(self, polling_manager=None): if not polling_manager: polling_manager = polling.get_polling_manager( @@ -1983,34 +2012,8 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, self.iter_num) ovs_status = self.check_ovs_status() if ovs_status == constants.OVS_RESTARTED: - self.setup_integration_br() - self.setup_physical_bridges(self.bridge_mappings) - if self.enable_tunneling: - self._reset_tunnel_ofports() - self.setup_tunnel_br() - self.setup_tunnel_br_flows() - tunnel_sync = True - if self.enable_distributed_routing: - self.dvr_agent.reset_ovs_parameters(self.int_br, - self.tun_br, - self.patch_int_ofport, - self.patch_tun_ofport) - self.dvr_agent.reset_dvr_parameters() - self.dvr_agent.setup_dvr_flows() - # notify that OVS has restarted - registry.notify( - callback_resources.AGENT, - callback_events.OVS_RESTARTED, - self) - # restart the polling manager so that it will signal as added - # all the current ports - # REVISIT (rossella_s) Define a method "reset" in - # BasePollingManager that will be implemented by AlwaysPoll as - # no action and by InterfacePollingMinimizer as start/stop - if isinstance( - polling_manager, polling.InterfacePollingMinimizer): - polling_manager.stop() - polling_manager.start() + self._handle_ovs_restart(polling_manager) + tunnel_sync = self.enable_tunneling or tunnel_sync elif ovs_status == constants.OVS_DEAD: # Agent doesn't apply any operations when ovs is dead, to # prevent unexpected failure or crash. Sleep and continue