From 5dd2bc0a3c98218e7b2388f515414118be7fbf0a Mon Sep 17 00:00:00 2001 From: Terry Wilson Date: Tue, 13 Nov 2018 17:13:46 +0000 Subject: [PATCH] Remove polling from test_create_bridges It is possible to use ovsdbapp Events to wait for bridges to be created instead of polling until they exist. Change-Id: I97f1c15a13a3bb90d774066a9933f3a4d39f50e2 --- .../agent/ovsdb/native/test_connection.py | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/neutron/tests/functional/agent/ovsdb/native/test_connection.py b/neutron/tests/functional/agent/ovsdb/native/test_connection.py index 98fc2cd87f6..f821801927b 100644 --- a/neutron/tests/functional/agent/ovsdb/native/test_connection.py +++ b/neutron/tests/functional/agent/ovsdb/native/test_connection.py @@ -13,11 +13,38 @@ # License for the specific language governing permissions and limitations # under the License. +import threading + +from ovsdbapp import event + from neutron.agent.common import ovs_lib -from neutron.common import utils as common_utils from neutron.tests.functional import base +class WaitForBridgesEvent(event.RowEvent): + event_name = 'WaitForBridgesEvent' + ONETIME = True + + def __init__(self, bridges, timeout=5): + self.bridges_not_seen = set(bridges) + self.timeout = timeout + self.event = threading.Event() + super(WaitForBridgesEvent, self).__init__( + (self.ROW_CREATE,), 'Bridge', None) + + def matches(self, event, row, old=None): + if event not in self.events or row._table.name != self.table: + return False + self.bridges_not_seen.discard(row.name) + return not self.bridges_not_seen + + def run(self, event, row, old): + self.event.set() + + def wait(self): + return self.event.wait(self.timeout) + + class BridgeMonitorTestCase(base.BaseLoggingTestCase): def _delete_bridges(self, bridges): @@ -25,23 +52,16 @@ class BridgeMonitorTestCase(base.BaseLoggingTestCase): self.ovs.delete_bridge(bridge) def test_create_bridges(self): - bridges_added = [] bridges_to_monitor = ['br01', 'br02', 'br03'] bridges_to_create = ['br01', 'br02', 'br03', 'br04', 'br05'] self.ovs = ovs_lib.BaseOVS() self.ovs.ovsdb.idl_monitor.start_bridge_monitor(bridges_to_monitor) self.addCleanup(self._delete_bridges, bridges_to_create) - + event = WaitForBridgesEvent(bridges_to_monitor) + self.ovs.ovsdb.idl_monitor.notify_handler.watch_event(event) for bridge in bridges_to_create: self.ovs.add_bridge(bridge) - - def retrieve_bridges(bridges_added): - bridges_added += self.ovs.ovsdb.idl_monitor.bridges_added - return len(bridges_added) - - common_utils.wait_until_true( - lambda: retrieve_bridges(bridges_added) == len(bridges_to_monitor), - timeout=5) - bridges_added.sort() - self.assertEqual(bridges_to_monitor, bridges_added) + self.assertTrue(event.wait()) + self.assertEqual(bridges_to_monitor, + self.ovs.ovsdb.idl_monitor.bridges_added) self.assertEqual([], self.ovs.ovsdb.idl_monitor.bridges_added)