From e615106ab89f38e7ad9ff60ea468ad161a8f77db Mon Sep 17 00:00:00 2001 From: Eduardo Olivares <eolivare@redhat.com> Date: Tue, 10 Sep 2024 17:25:00 +0200 Subject: [PATCH] Add retries to get_device_port_at_ovs Extending retries added to `get_ovs_patch_port_ofport` at [1]. [1] https://review.opendev.org/c/885976 Closes-Bug: #2080258 Change-Id: Id41336ad235159d5fbe125c6c1bbecd2a73a819e --- ovn_bgp_agent/drivers/openstack/utils/ovs.py | 37 +++++++++---------- .../unit/drivers/openstack/utils/test_ovs.py | 4 +- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/ovn_bgp_agent/drivers/openstack/utils/ovs.py b/ovn_bgp_agent/drivers/openstack/utils/ovs.py index 8303c759..5f27aba5 100644 --- a/ovn_bgp_agent/drivers/openstack/utils/ovs.py +++ b/ovn_bgp_agent/drivers/openstack/utils/ovs.py @@ -50,9 +50,24 @@ def get_bridge_flows(bridge, filter_=None): 'ovs-ofctl', args)[0].split('\n')[1:-1] +@tenacity.retry( + retry=tenacity.retry_if_exception_type(agent_exc.PortNotFound), + wait=tenacity.wait_fixed(1), + stop=tenacity.stop_after_delay(5), + reraise=True) def get_device_port_at_ovs(device): - return ovn_bgp_agent.privileged.ovs_vsctl.ovs_cmd( - 'ovs-vsctl', ['get', 'Interface', device, 'ofport'])[0].rstrip() + try: + ofport = ovn_bgp_agent.privileged.ovs_vsctl.ovs_cmd( + 'ovs-vsctl', ['get', 'Interface', device, 'ofport'] + )[0].rstrip() + except Exception: + raise agent_exc.PortNotFound(port=device) + if ofport == '[]': + # NOTE(ltomasbo): there is a chance the patch port interface was + # created but not yet added to ovs bridge, therefore it exists but + # has an empty ofport. We should retry in this case + raise agent_exc.PortNotFound(port=device) + return ofport def get_ovs_ports_info(bridge): @@ -71,25 +86,9 @@ def get_ovs_patch_ports_info(bridge, prefix='patch-provnet-'): return in_ports -@tenacity.retry( - retry=tenacity.retry_if_exception_type(agent_exc.PatchPortNotFound), - wait=tenacity.wait_fixed(1), - stop=tenacity.stop_after_delay(5), - reraise=True) def get_ovs_patch_port_ofport(patch): patch_name = "patch-{}-to-br-int".format(patch) - try: - ofport = ovn_bgp_agent.privileged.ovs_vsctl.ovs_cmd( - 'ovs-vsctl', ['get', 'Interface', patch_name, 'ofport'] - )[0].rstrip() - except Exception: - raise agent_exc.PatchPortNotFound(localnet=patch) - if ofport == '[]': - # NOTE(ltomasbo): there is a chance the patch port interface was - # created but not yet added to ovs bridge, therefore it exists but - # has an empty ofport. We should retry in this case - raise agent_exc.PatchPortNotFound(localnet=patch) - return ofport + return get_device_port_at_ovs(patch_name) def ensure_mac_tweak_flows(bridge, mac, ports, cookie): diff --git a/ovn_bgp_agent/tests/unit/drivers/openstack/utils/test_ovs.py b/ovn_bgp_agent/tests/unit/drivers/openstack/utils/test_ovs.py index 1d5187df..41b7aef9 100644 --- a/ovn_bgp_agent/tests/unit/drivers/openstack/utils/test_ovs.py +++ b/ovn_bgp_agent/tests/unit/drivers/openstack/utils/test_ovs.py @@ -100,7 +100,7 @@ class TestOVS(test_base.TestCase): patch = 'fake-patch' self.mock_ovs_vsctl.ovs_cmd.side_effect = Exception - self.assertRaises(agent_exc.PatchPortNotFound, + self.assertRaises(agent_exc.PortNotFound, ovs_utils.get_ovs_patch_port_ofport, patch) expected_calls = [ @@ -121,7 +121,7 @@ class TestOVS(test_base.TestCase): ofport = ['[]'] self.mock_ovs_vsctl.ovs_cmd.return_value = ofport - self.assertRaises(agent_exc.PatchPortNotFound, + self.assertRaises(agent_exc.PortNotFound, ovs_utils.get_ovs_patch_port_ofport, patch) expected_calls = [