Skip to content

Commit

Permalink
[multi-asic][cli][chassis-db] Avoid connecting to chassis db when cli…
Browse files Browse the repository at this point in the history
… 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.
  • Loading branch information
vganesan-nokia authored Sep 14, 2021
1 parent 66ca6d3 commit 1863e1f
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
40 changes: 40 additions & 0 deletions src/sonic-py-common/sonic_py_common/device_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
NPU_NAME_PREFIX = "asic"
NAMESPACE_PATH_GLOB = "/run/netns/*"
ASIC_CONF_FILENAME = "asic.conf"
PLATFORM_ENV_CONF_FILENAME = "platform_env.conf"
FRONTEND_ASIC_SUB_ROLE = "FrontEnd"
BACKEND_ASIC_SUB_ROLE = "BackEnd"

Expand Down Expand Up @@ -164,6 +165,29 @@ def get_asic_conf_file_path():
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():
"""
Retreives the paths to the device's platform directory
Expand Down Expand Up @@ -374,6 +398,22 @@ def is_multi_npu():
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):
if npu_name.startswith(NPU_NAME_PREFIX):
return npu_name[len(NPU_NAME_PREFIX):]
Expand Down
17 changes: 15 additions & 2 deletions src/sonic-py-common/sonic_py_common/multi_asic.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from .device_info import CONTAINER_PLATFORM_PATH
from .device_info import HOST_DEVICE_PATH
from .device_info import get_platform
from .device_info import is_supervisor

ASIC_NAME_PREFIX = 'asic'
NAMESPACE_PATH_GLOB = '/run/netns/*'
Expand Down Expand Up @@ -45,7 +46,11 @@ def connect_config_db_for_ns(namespace=DEFAULT_NAMESPACE):
def connect_to_all_dbs_for_ns(namespace=DEFAULT_NAMESPACE):
"""
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
default namespace.
In case of multi ASIC, the default namespace is the
Expand All @@ -56,7 +61,15 @@ def connect_to_all_dbs_for_ns(namespace=DEFAULT_NAMESPACE):
handle to all the dbs for a namespaces
"""
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)
return db

Expand Down

0 comments on commit 1863e1f

Please sign in to comment.