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.

Conflicts:
	neutron/tests/functional/agent/test_l2_ovs_agent.py

Change-Id: I9aebe7ccc3e2f565b4339d42842d89b911131b1f
Closes-Bug: 1646526
Partial-Bug: 1657689
(cherry picked from commit ea2cab0e15)
This commit is contained in:
Thomas Morin 2017-01-18 10:50:44 +01:00 committed by Daniel Alvarez
parent 87824370fc
commit dbf657a799
3 changed files with 30 additions and 0 deletions

View File

@ -43,3 +43,5 @@ ABORT_DELETE = 'abort_delete'
ABORT = 'abort_'
BEFORE = 'before_'
PRECOMMIT = 'precommit_'
OVS_RESTARTED = 'ovs_restarted'

View File

@ -46,6 +46,7 @@ from neutron.api.rpc.callbacks import resources
from neutron.api.rpc.handlers import dvr_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
@ -1969,6 +1970,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

View File

@ -14,10 +14,14 @@
# License for the specific language governing permissions and limitations
# under the License.
import mock
import time
from eventlet.timeout import Timeout
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
@ -322,6 +326,24 @@ class TestOVSAgent(base.OVSAgentTestFramework):
Timeout, 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):