[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:
parent
66ca6d33c7
commit
1863e1fa26
@ -29,6 +29,7 @@ HWSKU_JSON_FILE = 'hwsku.json'
|
||||
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"
|
||||
|
||||
@ -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
|
||||
@ -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):]
|
||||
|
@ -8,6 +8,7 @@ from swsscommon import swsscommon
|
||||
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/*'
|
||||
@ -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
|
||||
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
|
||||
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user