diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py index 08c54c2b40b..0ca25a41847 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py @@ -38,6 +38,19 @@ from neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb import ovsdb_monitor LOG = log.getLogger(__name__) +# Override wait_for_change to not use a timeout so we always try to reconnect +def wait_for_change(idl_, timeout, seqno=None): + if seqno is None: + seqno = idl_.change_seqno + while idl_.change_seqno == seqno and not idl_.run(): + poller = idlutils.poller.Poller() + idl_.wait(poller) + poller.block() + + +idlutils.wait_for_change = wait_for_change + + class OvnNbTransaction(idl_trans.Transaction): def __init__(self, *args, **kwargs): diff --git a/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py b/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py index 6058c564413..24caa93904e 100644 --- a/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py +++ b/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py @@ -14,6 +14,7 @@ import uuid +from ovsdbapp.backend.ovs_idl import connection from ovsdbapp import event as ovsdb_event from ovsdbapp.tests.functional import base from ovsdbapp.tests import utils @@ -147,3 +148,23 @@ class TestSbApi(base.FunctionalTestCase, self.assertEqual( (chassis.name, str(binding.datapath.uuid)), self.api.get_logical_port_chassis_and_datapath(port.name)) + + +class TestIgnoreConnectionTimeout(base.FunctionalTestCase, + n_base.BaseLoggingTestCase): + schemas = ['OVN_Southbound', 'OVN_Northbound'] + + def setUp(self): + super(TestIgnoreConnectionTimeout, self).setUp() + self.api = impl.OvsdbSbOvnIdl(self.connection['OVN_Southbound']) + self.nbapi = impl.OvsdbNbOvnIdl(self.connection['OVN_Northbound']) + self.handler = ovsdb_event.RowEventHandler() + self.api.idl.notify = self.handler.notify + + @classmethod + def create_connection(cls, schema): + idl = connection.OvsdbIdl.from_server(cls.schema_map[schema], schema) + return connection.Connection(idl, 0) + + def test_setUp_will_fail_if_this_is_broken(self): + pass