From 01159cb33d88d23a7c7ab8bbc003001a00713f35 Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Thu, 27 Aug 2020 23:07:29 -0700 Subject: [PATCH 1/4] Common functions to py-common --- .../sonic_py_common/interface.py | 40 +++++++++++++++++++ .../sonic_py_common/multi_asic.py | 12 ++++++ 2 files changed, 52 insertions(+) diff --git a/src/sonic-py-common/sonic_py_common/interface.py b/src/sonic-py-common/sonic_py_common/interface.py index 9136b71f780..9f9b8b522ec 100644 --- a/src/sonic-py-common/sonic_py_common/interface.py +++ b/src/sonic-py-common/sonic_py_common/interface.py @@ -1,3 +1,7 @@ +""" +SONiC interface types and access functions. +""" + """ Dictionary of SONIC interface name prefixes. Each entry in the format "Human readable interface string":"Sonic interface prefix" @@ -41,3 +45,39 @@ def loopback_prefix(): Retrieves the SONIC Loopback interface name prefix. """ return SONIC_INTERFACE_PREFIXES["Loopback"] + +def get_interface_table_name(interface_name): + """Get table name by interface_name prefix + """ + if interface_name.startswith(front_panel_prefix()): + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + return "VLAN_SUB_INTERFACE" + return "INTERFACE" + elif interface_name.startswith(portchannel_prefix()): + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + return "VLAN_SUB_INTERFACE" + return "PORTCHANNEL_INTERFACE" + elif interface_name.startswith(vlan_prefix()): + return "VLAN_INTERFACE" + elif interface_name.startswith(loopback_prefix()): + return "LOOPBACK_INTERFACE" + else: + return "" + +def get_port_table_name(interface_name): + """Get table name by port_name prefix + """ + if interface_name.startswith(front_panel_prefix()): + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + return "VLAN_SUB_INTERFACE" + return "PORT" + elif interface_name.startswith(portchannel_prefix()): + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + return "VLAN_SUB_INTERFACE" + return "PORTCHANNEL" + elif interface_name.startswith(vlan_prefix()): + return "VLAN_INTERFACE" + elif interface_name.startswith(loopback_prefix()): + return "LOOPBACK_INTERFACE" + else: + return "" diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index 78bc6d72ba9..e0780333e26 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -344,3 +344,15 @@ def get_asic_index_from_namespace(namespace): return int(get_asic_id_from_name(namespace)) return 0 + +# Validate whether a given namespace name is valid in the device. +# This API is significant in multi-asic platforms. +def validate_namespace(namespace): + if not multi_asic.is_multi_asic(): + return True + + namespaces = get_all_namespaces() + if namespace in namespaces['front_ns'] + namespaces['back_ns']: + return True + else: + return False From be15daceae3c15a2c672558d2048264f15f3f756 Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Fri, 28 Aug 2020 17:17:43 -0700 Subject: [PATCH 2/4] Updates with some fixes when the functions were moved. --- src/sonic-py-common/sonic_py_common/interface.py | 2 ++ src/sonic-py-common/sonic_py_common/multi_asic.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sonic-py-common/sonic_py_common/interface.py b/src/sonic-py-common/sonic_py_common/interface.py index 9f9b8b522ec..10452c61312 100644 --- a/src/sonic-py-common/sonic_py_common/interface.py +++ b/src/sonic-py-common/sonic_py_common/interface.py @@ -16,6 +16,8 @@ "Ethernet-Backplane": "Ethernet-BP" } +VLAN_SUB_INTERFACE_SEPARATOR = '.' + def front_panel_prefix(): """ Retrieves the SONIC front panel interface name prefix. diff --git a/src/sonic-py-common/sonic_py_common/multi_asic.py b/src/sonic-py-common/sonic_py_common/multi_asic.py index e0780333e26..d5925ea37de 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -348,7 +348,7 @@ def get_asic_index_from_namespace(namespace): # Validate whether a given namespace name is valid in the device. # This API is significant in multi-asic platforms. def validate_namespace(namespace): - if not multi_asic.is_multi_asic(): + if not is_multi_asic(): return True namespaces = get_all_namespaces() From efccedf7de674a7b5b02a0df7902f19f23dc8fd5 Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Sat, 29 Aug 2020 00:05:09 -0700 Subject: [PATCH 3/4] Add unit tests for interface API's. --- src/sonic-py-common/tests/interface_test.py | 56 +++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/sonic-py-common/tests/interface_test.py diff --git a/src/sonic-py-common/tests/interface_test.py b/src/sonic-py-common/tests/interface_test.py new file mode 100644 index 00000000000..14e7afba573 --- /dev/null +++ b/src/sonic-py-common/tests/interface_test.py @@ -0,0 +1,56 @@ +import os +import sys + +# TODO: Remove this if/else block once we no longer support Python 2 +if sys.version_info.major == 3: + from unittest import mock +else: + # Expect the 'mock' package for python 2 + # https://pypi.python.org/pypi/mock + import mock + +from sonic_py_common import interface + + +# TODO: Remove this if/else block once we no longer support Python 2 +if sys.version_info.major == 3: + BUILTINS = "builtins" +else: + BUILTINS = "__builtin__" + +class TestInterface(object): + @classmethod + def setup_class(cls): + print("SETUP") + + def test_get_interface_table_name(self): + result = interface.get_interface_table_name("Ethernet0") + assert result == "INTERFACE" + result = interface.get_interface_table_name("Ethernet0.100") + assert result == "VLAN_SUB_INTERFACE" + result = interface.get_interface_table_name("PortChannel0") + assert result == "PORTCHANNEL_INTERFACE" + result = interface.get_interface_table_name("PortChannel0.100") + assert result == "VLAN_SUB_INTERFACE" + result = interface.get_interface_table_name("Vlan100") + assert result == "VLAN_INTERFACE" + result = interface.get_interface_table_name("Loopback0") + assert result == "LOOPBACK_INTERFACE" + + def test_get_port_table_name(self): + result = interface.get_port_table_name("Ethernet0") + assert result == "PORT" + result = interface.get_port_table_name("Ethernet0.100") + assert result == "VLAN_SUB_INTERFACE" + result = interface.get_port_table_name("PortChannel0") + assert result == "PORTCHANNEL" + result = interface.get_port_table_name("PortChannel0.100") + assert result == "VLAN_SUB_INTERFACE" + result = interface.get_port_table_name("Vlan100") + assert result == "VLAN_INTERFACE" + result = interface.get_port_table_name("Loopback0") + assert result == "LOOPBACK_INTERFACE" + + @classmethod + def teardown_class(cls): + print("TEARDOWN") From 491d3c10ce3c952499f1993a32539f224cb9d7c2 Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Sat, 29 Aug 2020 10:41:27 -0700 Subject: [PATCH 4/4] Updates to remove unused imports --- src/sonic-py-common/tests/interface_test.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/sonic-py-common/tests/interface_test.py b/src/sonic-py-common/tests/interface_test.py index 14e7afba573..bb904797338 100644 --- a/src/sonic-py-common/tests/interface_test.py +++ b/src/sonic-py-common/tests/interface_test.py @@ -1,23 +1,8 @@ import os import sys -# TODO: Remove this if/else block once we no longer support Python 2 -if sys.version_info.major == 3: - from unittest import mock -else: - # Expect the 'mock' package for python 2 - # https://pypi.python.org/pypi/mock - import mock - from sonic_py_common import interface - -# TODO: Remove this if/else block once we no longer support Python 2 -if sys.version_info.major == 3: - BUILTINS = "builtins" -else: - BUILTINS = "__builtin__" - class TestInterface(object): @classmethod def setup_class(cls):