From 125f36f3fb87c6687b0906a94d7533ffa6e0835b Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 18 Mar 2024 00:05:59 -0700 Subject: [PATCH] [ipintutil]Handle exception in show ip interfaces command (#3182) ### What I did Handle exception in show ip interfaces command when executed during config reload. Sometimes during config reload the interfaces are removed and if show ip interfaces was executed during this time we may get the below traceback. The interface would exist when the call multi_asic_get_ip_intf_from_ns was made but would have been removed in the subsequent for loop which tries to get ip interface data for each interface ``` show ip interfaces Traceback (most recent call last): File "/usr/local/bin/ipintutil", line 276, in main() File "/usr/local/bin/ipintutil", line 269, in main ip_intfs = get_ip_intfs(af, namespace, display) File "/usr/local/bin/ipintutil", line 232, in get_ip_intfs ip_intfs_in_ns = get_ip_intfs_in_namespace(af, namespace, display) File "/usr/local/bin/ipintutil", line 153, in get_ip_intfs_in_namespace ipaddresses = multi_asic_util.multi_asic_get_ip_intf_addr_from_ns(namespace, iface) File "/usr/local/lib/python3.9/dist-packages/utilities_common/multi_asic.py", line 186, in multi_asic_get_ip_intf_addr_from_ns ipaddresses = netifaces.ifaddresses(iface) ValueError: You must specify a valid interface name. ``` #### How I did it Adding try exception block so that if an interface is not present, it would be skipped. #### How to verify it Running show ip interface command and performing config reload in parallel --- scripts/ipintutil | 6 +++++- tests/mock_tables/mock_single_asic.py | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/ipintutil b/scripts/ipintutil index 5535bce7e7..85879972e0 100755 --- a/scripts/ipintutil +++ b/scripts/ipintutil @@ -29,6 +29,7 @@ try: mock_tables.dbconnector.load_namespace_config() else: import mock_tables.mock_single_asic + mock_tables.mock_single_asic.add_unknown_intf=True except KeyError: pass @@ -150,7 +151,10 @@ def get_ip_intfs_in_namespace(af, namespace, display): ip_intf_attr = [] if namespace != constants.DEFAULT_NAMESPACE and skip_ip_intf_display(iface, display): continue - ipaddresses = multi_asic_util.multi_asic_get_ip_intf_addr_from_ns(namespace, iface) + try: + ipaddresses = multi_asic_util.multi_asic_get_ip_intf_addr_from_ns(namespace, iface) + except ValueError: + continue if af in ipaddresses: ifaddresses = [] bgp_neighs = {} diff --git a/tests/mock_tables/mock_single_asic.py b/tests/mock_tables/mock_single_asic.py index 08c2157c9d..ac97c4bc79 100644 --- a/tests/mock_tables/mock_single_asic.py +++ b/tests/mock_tables/mock_single_asic.py @@ -4,6 +4,8 @@ from sonic_py_common import multi_asic from utilities_common import multi_asic as multi_asic_util +add_unknown_intf=False + mock_intf_table = { '': { 'eth0': { @@ -60,6 +62,8 @@ def mock_single_asic_get_ip_intf_from_ns(namespace): interfaces = [] try: interfaces = list(mock_intf_table[namespace].keys()) + if add_unknown_intf: + interfaces.append("unknownintf") except KeyError: pass return interfaces @@ -70,7 +74,8 @@ def mock_single_asic_get_ip_intf_addr_from_ns(namespace, iface): try: ipaddresses = mock_intf_table[namespace][iface] except KeyError: - pass + if add_unknown_intf: + raise ValueError("Unknow interface") return ipaddresses