From 1a424780a011e2a1efba2e1f6712f1c2a30c626a Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Wed, 19 Aug 2020 19:34:04 -0700 Subject: [PATCH 1/4] Add common functions applicable to single/multi asic platforms --- .../sonic_py_common/multi_asic.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) 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 8fc22141e7c4..a39b7a28a215 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -298,3 +298,33 @@ def is_bgp_session_internal(bgp_neigh_ip, namespace=None): else: return False return False + +def get_front_end_namespaces(): + """ + Get the namespaces in the platform. For multi-asic devices we get the namespaces + mapped to asic which have front-panel interfaces. For single ASIC device it is the + EMPTY_NAMESPACE which maps to the linux host. + + Returns: + a list of namespaces + """ + namespaces = [EMPTY_NAMESPACE] + if is_multi_asic(): + ns_list = get_all_namespaces() + namespaces = ns_list['front_ns'] + + return namespaces + +def get_asic_index_from_namespace(namespace): + """ + Get asic index from the namespace name. + With single ASIC platform, namespace is EMPTY_NAMESPACE, return asic_index 0 + + Returns: + asic_index as an integer. + """ + asic_id_string = get_asic_id_from_name(namespace) + if asic_id_string is not None: + return int(asic_id_string) + + return 0 From ed9166980c03ac0ff01fc267f463c608adcf93b9 Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Thu, 20 Aug 2020 14:12:17 -0700 Subject: [PATCH 2/4] Updates from review. --- src/sonic-py-common/sonic_py_common/multi_asic.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 a39b7a28a215..5136dc71dce5 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -303,12 +303,12 @@ def get_front_end_namespaces(): """ Get the namespaces in the platform. For multi-asic devices we get the namespaces mapped to asic which have front-panel interfaces. For single ASIC device it is the - EMPTY_NAMESPACE which maps to the linux host. + DEFAULT_NAMESPACE which maps to the linux host. Returns: a list of namespaces """ - namespaces = [EMPTY_NAMESPACE] + namespaces = [DEFAULT_NAMESPACE] if is_multi_asic(): ns_list = get_all_namespaces() namespaces = ns_list['front_ns'] @@ -318,13 +318,16 @@ def get_front_end_namespaces(): def get_asic_index_from_namespace(namespace): """ Get asic index from the namespace name. - With single ASIC platform, namespace is EMPTY_NAMESPACE, return asic_index 0 + With single ASIC platform, return asic_index 0, which is mapped to the only asic present. Returns: asic_index as an integer. + None, if namespace given as input is not mapped to any asic in multi-asic platform. """ - asic_id_string = get_asic_id_from_name(namespace) - if asic_id_string is not None: - return int(asic_id_string) + if is_multi_asic(): + asic_id_string = get_asic_id_from_name(namespace) + if asic_id_string is not None: + return int(asic_id_string) + return None return 0 From d0b9421675b599880108069a2275e1c1a341830d Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Thu, 20 Aug 2020 15:52:26 -0700 Subject: [PATCH 3/4] Raise exception if invalid namespace is given as input. --- src/sonic-py-common/sonic_py_common/multi_asic.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 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 5136dc71dce5..f973405ebdff 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -123,11 +123,16 @@ def is_multi_asic(): def get_asic_id_from_name(asic_name): + """ + Get the asic id from the asic name for multi-asic platforms + Returns: + asic id. + """ if asic_name.startswith(ASIC_NAME_PREFIX): return asic_name[len(ASIC_NAME_PREFIX):] else: - return None + raise ValueError('Unknown asic namespace name {}'.format(asic_name)) def get_namespaces_from_linux(): @@ -315,6 +320,7 @@ def get_front_end_namespaces(): return namespaces + def get_asic_index_from_namespace(namespace): """ Get asic index from the namespace name. @@ -322,12 +328,8 @@ def get_asic_index_from_namespace(namespace): Returns: asic_index as an integer. - None, if namespace given as input is not mapped to any asic in multi-asic platform. """ if is_multi_asic(): - asic_id_string = get_asic_id_from_name(namespace) - if asic_id_string is not None: - return int(asic_id_string) - return None + return int(get_asic_id_from_name(namespace)) return 0 From 3b0d57f506ec08261d7965998fd8bb162507127c Mon Sep 17 00:00:00 2001 From: Judy Joseph Date: Thu, 20 Aug 2020 18:03:27 -0700 Subject: [PATCH 4/4] Update the comments to API get_asic_id_from_name() --- src/sonic-py-common/sonic_py_common/multi_asic.py | 1 + 1 file changed, 1 insertion(+) 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 f973405ebdff..443e04cbe60a 100644 --- a/src/sonic-py-common/sonic_py_common/multi_asic.py +++ b/src/sonic-py-common/sonic_py_common/multi_asic.py @@ -125,6 +125,7 @@ def is_multi_asic(): def get_asic_id_from_name(asic_name): """ Get the asic id from the asic name for multi-asic platforms + In single ASIC platforms, it would fail and throw an exception. Returns: asic id.