From ea2cab0e15079490fb772ffa077f5aad236e8239 Mon Sep 17 00:00:00 2001 From: Thomas Morin Date: Wed, 18 Jan 2017 10:50:44 +0100 Subject: [PATCH] openvswitch agent: add OVS_RESTARTED event This new event is aimed at informing that OVS has restarted, and in particular to let L2 extensions know that they may need to setup their flows again. Change-Id: I9aebe7ccc3e2f565b4339d42842d89b911131b1f Closes-Bug: 1646526 Partial-Bug: 1657689 --- neutron/callbacks/events.py | 2 ++ .../openvswitch/agent/ovs_neutron_agent.py | 6 +++++ .../functional/agent/test_l2_ovs_agent.py | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/neutron/callbacks/events.py b/neutron/callbacks/events.py index 15f4c100cf8..42e06231702 100644 --- a/neutron/callbacks/events.py +++ b/neutron/callbacks/events.py @@ -43,3 +43,5 @@ ABORT_DELETE = 'abort_delete' ABORT = 'abort_' BEFORE = 'before_' PRECOMMIT = 'precommit_' + +OVS_RESTARTED = 'ovs_restarted' 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 8f90be7c251..cedf28d7000 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -47,6 +47,7 @@ from neutron.api.rpc.handlers import dvr_rpc from neutron.api.rpc.handlers import securitygroups_rpc as sg_rpc from neutron.callbacks import events as callback_events from neutron.callbacks import registry +from neutron.callbacks import resources as callback_resources from neutron.common import config from neutron.common import constants as c_const from neutron.common import topics @@ -1966,6 +1967,11 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, 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 diff --git a/neutron/tests/functional/agent/test_l2_ovs_agent.py b/neutron/tests/functional/agent/test_l2_ovs_agent.py index 7e5288bfbe3..0dfb7f516b9 100644 --- a/neutron/tests/functional/agent/test_l2_ovs_agent.py +++ b/neutron/tests/functional/agent/test_l2_ovs_agent.py @@ -14,8 +14,12 @@ # License for the specific language governing permissions and limitations # under the License. +import mock import time +from neutron.callbacks import events +from neutron.callbacks import registry +from neutron.callbacks import resources from neutron.common import utils from neutron.plugins.ml2.drivers.openvswitch.agent.common import constants from neutron.tests.common import net_helpers @@ -320,6 +324,24 @@ class TestOVSAgent(base.OVSAgentTestFramework): utils.WaitTimeout, self.wait_until_ports_state, [self.ports[1]], up=True, timeout=10) + def test_ovs_restarted_event(self): + callback = mock.Mock() + + self.setup_agent_and_ports( + port_dicts=self.create_test_ports()) + + registry.subscribe(callback, + resources.AGENT, + events.OVS_RESTARTED) + + self.agent.check_ovs_status.return_value = constants.OVS_RESTARTED + + utils.wait_until_true(lambda: callback.call_count, timeout=10) + + callback.assert_called_with(resources.AGENT, + events.OVS_RESTARTED, + mock.ANY) + class TestOVSAgentExtensionConfig(base.OVSAgentTestFramework): def setUp(self):