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 = [