[multi-asic][cli][chassis-db] Avoid connecting to chassis db when cli commands are executed from linecards (#8065)

* [multi-asic][cli][chassis-db] Avoiding connecting to chassis db

Currently, for all the cli commands, we connect to all databases
mentioned in the database_config.json. The database_config.json also
includes the databases from chassis redis server from supervisor card.
It is unneccessary to connect to databases from chassis redis server
when cli commands are executed form linecard. But we need to allow
connection to chassis databases when the cli commands are executed from
supervisor card.

The changes in this PR fixes this problem. This PR requires that
asic.conf in supervisor card includes VOQ_SUPERVISOR with value 1 to
indentify the supervisor card. The connect_to_all_dbs_for_ns() is
changed to skip chassis databases form the list of collected databases
if the card is not supervisor card.
This commit is contained in:
vganesan-nokia 2021-09-14 14:04:19 -04:00 committed by Judy Joseph
parent 78c31722e9
commit 79ed384621
2 changed files with 55 additions and 2 deletions

View File

@ -29,6 +29,7 @@ HWSKU_JSON_FILE = 'hwsku.json'
NPU_NAME_PREFIX = "asic" NPU_NAME_PREFIX = "asic"
NAMESPACE_PATH_GLOB = "/run/netns/*" NAMESPACE_PATH_GLOB = "/run/netns/*"
ASIC_CONF_FILENAME = "asic.conf" ASIC_CONF_FILENAME = "asic.conf"
PLATFORM_ENV_CONF_FILENAME = "platform_env.conf"
FRONTEND_ASIC_SUB_ROLE = "FrontEnd" FRONTEND_ASIC_SUB_ROLE = "FrontEnd"
BACKEND_ASIC_SUB_ROLE = "BackEnd" BACKEND_ASIC_SUB_ROLE = "BackEnd"
@ -164,6 +165,29 @@ def get_asic_conf_file_path():
return None return None
def get_platform_env_conf_file_path():
"""
Retrieves the path to the PLATFORM ENV conguration file on the device
Returns:
A string containing the path to the PLATFORM ENV conguration file on success,
None on failure
"""
platform_env_conf_path_candidates = []
platform_env_conf_path_candidates.append(os.path.join(CONTAINER_PLATFORM_PATH, PLATFORM_ENV_CONF_FILENAME))
platform = get_platform()
if platform:
platform_env_conf_path_candidates.append(os.path.join(HOST_DEVICE_PATH, platform, PLATFORM_ENV_CONF_FILENAME))
for platform_env_conf_file_path in platform_env_conf_path_candidates:
if os.path.isfile(platform_env_conf_file_path):
return platform_env_conf_file_path
return None
def get_path_to_platform_dir(): def get_path_to_platform_dir():
""" """
Retreives the paths to the device's platform directory Retreives the paths to the device's platform directory
@ -374,6 +398,22 @@ def is_multi_npu():
return (num_npus > 1) return (num_npus > 1)
def is_supervisor():
platform_env_conf_file_path = get_platform_env_conf_file_path()
if platform_env_conf_file_path is None:
return False
with open(platform_env_conf_file_path) as platform_env_conf_file:
for line in platform_env_conf_file:
tokens = line.split('=')
if len(tokens) < 2:
continue
if tokens[0].lower() == 'supervisor':
val = tokens[1].strip()
if val == '1':
return True
return False
def get_npu_id_from_name(npu_name): def get_npu_id_from_name(npu_name):
if npu_name.startswith(NPU_NAME_PREFIX): if npu_name.startswith(NPU_NAME_PREFIX):
return npu_name[len(NPU_NAME_PREFIX):] return npu_name[len(NPU_NAME_PREFIX):]

View File

@ -8,6 +8,7 @@ from swsscommon import swsscommon
from .device_info import CONTAINER_PLATFORM_PATH from .device_info import CONTAINER_PLATFORM_PATH
from .device_info import HOST_DEVICE_PATH from .device_info import HOST_DEVICE_PATH
from .device_info import get_platform from .device_info import get_platform
from .device_info import is_supervisor
ASIC_NAME_PREFIX = 'asic' ASIC_NAME_PREFIX = 'asic'
NAMESPACE_PATH_GLOB = '/run/netns/*' NAMESPACE_PATH_GLOB = '/run/netns/*'
@ -46,6 +47,10 @@ def connect_to_all_dbs_for_ns(namespace=DEFAULT_NAMESPACE):
""" """
The function connects to the DBs for a given namespace and The function connects to the DBs for a given namespace and
returns the handle returns the handle
For voq chassis systems, the db list includes databases from
supervisor card. Avoid connecting to these databases from linecards
If no namespace is provided, it will connect to the db in the If no namespace is provided, it will connect to the db in the
default namespace. default namespace.
In case of multi ASIC, the default namespace is the In case of multi ASIC, the default namespace is the
@ -56,7 +61,15 @@ def connect_to_all_dbs_for_ns(namespace=DEFAULT_NAMESPACE):
handle to all the dbs for a namespaces handle to all the dbs for a namespaces
""" """
db = swsscommon.SonicV2Connector(namespace=namespace) db = swsscommon.SonicV2Connector(namespace=namespace)
for db_id in db.get_db_list(): db_list = list(db.get_db_list())
if not is_supervisor():
try:
db_list.remove('CHASSIS_APP_DB')
db_list.remove('CHASSIS_STATE_DB')
except Exception:
pass
for db_id in db_list:
db.connect(db_id) db.connect(db_id)
return db return db