[sonic-config-engine] Remove sonic_device_util.py (#5130)
sonic_device_util.py has been deprecated in favor of the sonic-py-common package. All related functionality has been moved there.
This commit is contained in:
parent
78baecef80
commit
966ac85e24
@ -16,7 +16,7 @@ setup(name='sonic-config-engine',
|
|||||||
author='Taoyu Li',
|
author='Taoyu Li',
|
||||||
author_email='taoyl@microsoft.com',
|
author_email='taoyl@microsoft.com',
|
||||||
url='https://github.com/Azure/sonic-buildimage',
|
url='https://github.com/Azure/sonic-buildimage',
|
||||||
py_modules=['portconfig', 'minigraph', 'openconfig_acl', 'sonic_device_util', 'config_samples', 'redis_bcc', 'lazy_re'],
|
py_modules=['portconfig', 'minigraph', 'openconfig_acl', 'config_samples', 'redis_bcc', 'lazy_re'],
|
||||||
scripts=['sonic-cfggen'],
|
scripts=['sonic-cfggen'],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
'ipaddr',
|
'ipaddr',
|
||||||
|
@ -1,220 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
import os
|
|
||||||
import yaml
|
|
||||||
import subprocess
|
|
||||||
import re
|
|
||||||
from natsort import natsorted
|
|
||||||
import glob
|
|
||||||
from swsssdk import ConfigDBConnector, SonicDBConfig
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: sonic_device_util
|
|
||||||
version_added: "1.9"
|
|
||||||
short_description: Retrieve device related facts for a device.
|
|
||||||
description:
|
|
||||||
- Retrieve device related facts from config files.
|
|
||||||
'''
|
|
||||||
|
|
||||||
'''
|
|
||||||
TODO: this file shall be renamed and moved to other places in future
|
|
||||||
to have it shared with multiple applications.
|
|
||||||
'''
|
|
||||||
SONIC_DEVICE_PATH = '/usr/share/sonic/device'
|
|
||||||
NPU_NAME_PREFIX = 'asic'
|
|
||||||
NAMESPACE_PATH_GLOB = '/run/netns/*'
|
|
||||||
ASIC_CONF_FILENAME = 'asic.conf'
|
|
||||||
FRONTEND_ASIC_SUB_ROLE = 'FrontEnd'
|
|
||||||
BACKEND_ASIC_SUB_ROLE = 'BackEnd'
|
|
||||||
def get_machine_info():
|
|
||||||
if not os.path.isfile('/host/machine.conf'):
|
|
||||||
return None
|
|
||||||
machine_vars = {}
|
|
||||||
with open('/host/machine.conf') as machine_file:
|
|
||||||
for line in machine_file:
|
|
||||||
tokens = line.split('=')
|
|
||||||
if len(tokens) < 2:
|
|
||||||
continue
|
|
||||||
machine_vars[tokens[0]] = tokens[1].strip()
|
|
||||||
return machine_vars
|
|
||||||
|
|
||||||
def get_npu_id_from_name(npu_name):
|
|
||||||
if npu_name.startswith(NPU_NAME_PREFIX):
|
|
||||||
return npu_name[len(NPU_NAME_PREFIX):]
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_asic_conf_file_path(platform):
|
|
||||||
asic_conf_path_candidates = []
|
|
||||||
asic_conf_path_candidates.append(os.path.join('/usr/share/sonic/platform', ASIC_CONF_FILENAME))
|
|
||||||
if platform is not None:
|
|
||||||
asic_conf_path_candidates.append(os.path.join(SONIC_DEVICE_PATH, platform, ASIC_CONF_FILENAME))
|
|
||||||
for asic_conf_file_path in asic_conf_path_candidates:
|
|
||||||
if os.path.isfile(asic_conf_file_path):
|
|
||||||
return asic_conf_file_path
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_num_npus():
|
|
||||||
platform = get_platform_info(get_machine_info())
|
|
||||||
asic_conf_file_path = get_asic_conf_file_path(platform)
|
|
||||||
if asic_conf_file_path is None:
|
|
||||||
return 1
|
|
||||||
with open(asic_conf_file_path) as asic_conf_file:
|
|
||||||
for line in asic_conf_file:
|
|
||||||
tokens = line.split('=')
|
|
||||||
if len(tokens) < 2:
|
|
||||||
continue
|
|
||||||
if tokens[0].lower() == 'num_asic':
|
|
||||||
num_npus = tokens[1].strip()
|
|
||||||
return int(num_npus)
|
|
||||||
|
|
||||||
def get_namespaces():
|
|
||||||
"""
|
|
||||||
In a multi NPU platform, each NPU is in a Linux Namespace.
|
|
||||||
This method returns list of all the Namespace present on the device
|
|
||||||
"""
|
|
||||||
ns_list = []
|
|
||||||
for path in glob.glob(NAMESPACE_PATH_GLOB):
|
|
||||||
ns = os.path.basename(path)
|
|
||||||
ns_list.append(ns)
|
|
||||||
return natsorted(ns_list)
|
|
||||||
|
|
||||||
def get_hwsku():
|
|
||||||
config_db = ConfigDBConnector()
|
|
||||||
config_db.connect()
|
|
||||||
metadata = config_db.get_table('DEVICE_METADATA')
|
|
||||||
return metadata['localhost']['hwsku']
|
|
||||||
|
|
||||||
def get_platform():
|
|
||||||
if not os.path.isfile('/host/machine.conf'):
|
|
||||||
return ''
|
|
||||||
|
|
||||||
with open('/host/machine.conf') as machine_conf:
|
|
||||||
for line in machine_conf:
|
|
||||||
tokens = line.split('=')
|
|
||||||
if tokens[0].strip() == 'onie_platform' or tokens[0].strip() == 'aboot_platform':
|
|
||||||
return tokens[1].strip()
|
|
||||||
return ''
|
|
||||||
|
|
||||||
def is_multi_npu():
|
|
||||||
num_npus = get_num_npus()
|
|
||||||
return (num_npus > 1)
|
|
||||||
|
|
||||||
def get_all_namespaces():
|
|
||||||
"""
|
|
||||||
In case of Multi-Asic platform, Each ASIC will have a linux network namespace created.
|
|
||||||
So we loop through the databases in different namespaces and depending on the sub_role
|
|
||||||
decide whether this is a front end ASIC/namespace or a back end one.
|
|
||||||
"""
|
|
||||||
front_ns = []
|
|
||||||
back_ns = []
|
|
||||||
num_npus = get_num_npus()
|
|
||||||
SonicDBConfig.load_sonic_global_db_config()
|
|
||||||
|
|
||||||
if is_multi_npu():
|
|
||||||
for npu in range(num_npus):
|
|
||||||
namespace = "{}{}".format(NPU_NAME_PREFIX, npu)
|
|
||||||
config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=namespace)
|
|
||||||
config_db.connect()
|
|
||||||
|
|
||||||
metadata = config_db.get_table('DEVICE_METADATA')
|
|
||||||
if metadata['localhost']['sub_role'] == FRONTEND_ASIC_SUB_ROLE:
|
|
||||||
front_ns.append(namespace)
|
|
||||||
elif metadata['localhost']['sub_role'] == BACKEND_ASIC_SUB_ROLE:
|
|
||||||
back_ns.append(namespace)
|
|
||||||
|
|
||||||
return {'front_ns':front_ns, 'back_ns':back_ns}
|
|
||||||
|
|
||||||
def get_platform_info(machine_info):
|
|
||||||
if machine_info != None:
|
|
||||||
if machine_info.has_key('onie_platform'):
|
|
||||||
return machine_info['onie_platform']
|
|
||||||
elif machine_info.has_key('aboot_platform'):
|
|
||||||
return machine_info['aboot_platform']
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_sonic_version_info():
|
|
||||||
if not os.path.isfile('/etc/sonic/sonic_version.yml'):
|
|
||||||
return None
|
|
||||||
data = {}
|
|
||||||
with open('/etc/sonic/sonic_version.yml') as stream:
|
|
||||||
if yaml.__version__ >= "5.1":
|
|
||||||
data = yaml.full_load(stream)
|
|
||||||
else:
|
|
||||||
data = yaml.load(stream)
|
|
||||||
return data
|
|
||||||
|
|
||||||
def valid_mac_address(mac):
|
|
||||||
return bool(re.match("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$", mac))
|
|
||||||
|
|
||||||
def get_system_mac(namespace=None):
|
|
||||||
version_info = get_sonic_version_info()
|
|
||||||
|
|
||||||
if (version_info['asic_type'] == 'mellanox'):
|
|
||||||
# With Mellanox ONIE release(2019.05-5.2.0012) and above
|
|
||||||
# "onie_base_mac" was added to /host/machine.conf:
|
|
||||||
# onie_base_mac=e4:1d:2d:44:5e:80
|
|
||||||
# So we have another way to get the mac address besides decode syseeprom
|
|
||||||
# By this can mitigate the dependency on the hw-management service
|
|
||||||
base_mac_key = "onie_base_mac"
|
|
||||||
machine_vars = get_machine_info()
|
|
||||||
if machine_vars is not None and base_mac_key in machine_vars:
|
|
||||||
mac = machine_vars[base_mac_key]
|
|
||||||
mac = mac.strip()
|
|
||||||
if valid_mac_address(mac):
|
|
||||||
return mac
|
|
||||||
|
|
||||||
hw_mac_entry_cmds = [ "sudo decode-syseeprom -m" ]
|
|
||||||
elif (version_info['asic_type'] == 'marvell'):
|
|
||||||
# Try valid mac in eeprom, else fetch it from eth0
|
|
||||||
platform = get_platform_info(get_machine_info())
|
|
||||||
hwsku = get_machine_info()['onie_machine']
|
|
||||||
profile_cmd = 'cat' + SONIC_DEVICE_PATH + '/' + platform +'/'+ hwsku +'/profile.ini | grep switchMacAddress | cut -f2 -d='
|
|
||||||
hw_mac_entry_cmds = [ profile_cmd, "sudo decode-syseeprom -m", "ip link show eth0 | grep ether | awk '{print $2}'" ]
|
|
||||||
else:
|
|
||||||
mac_address_cmd = "cat /sys/class/net/eth0/address"
|
|
||||||
if namespace is not None:
|
|
||||||
mac_address_cmd = "sudo ip netns exec {} {}".format(namespace, mac_address_cmd)
|
|
||||||
|
|
||||||
hw_mac_entry_cmds = [mac_address_cmd]
|
|
||||||
|
|
||||||
for get_mac_cmd in hw_mac_entry_cmds:
|
|
||||||
proc = subprocess.Popen(get_mac_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
||||||
(mac, err) = proc.communicate()
|
|
||||||
if err:
|
|
||||||
continue
|
|
||||||
mac = mac.strip()
|
|
||||||
if valid_mac_address(mac):
|
|
||||||
break
|
|
||||||
|
|
||||||
if not valid_mac_address(mac):
|
|
||||||
return None
|
|
||||||
|
|
||||||
# Align last byte of MAC if necessary
|
|
||||||
if version_info and version_info['asic_type'] == 'centec':
|
|
||||||
last_byte = mac[-2:]
|
|
||||||
aligned_last_byte = format(int(int(last_byte, 16) + 1), '02x')
|
|
||||||
mac = mac[:-2] + aligned_last_byte
|
|
||||||
return mac
|
|
||||||
|
|
||||||
#
|
|
||||||
# Function to obtain the routing-stack being utilized. Function is not
|
|
||||||
# platform-specific; it's being placed in this file temporarily till a more
|
|
||||||
# suitable location is identified as part of upcoming refactoring efforts.
|
|
||||||
#
|
|
||||||
def get_system_routing_stack():
|
|
||||||
command = "sudo docker ps | grep bgp | awk '{print$2}' | cut -d'-' -f3 | cut -d':' -f1"
|
|
||||||
|
|
||||||
try:
|
|
||||||
proc = subprocess.Popen(command,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
shell=True,
|
|
||||||
stderr=subprocess.STDOUT)
|
|
||||||
stdout = proc.communicate()[0]
|
|
||||||
proc.wait()
|
|
||||||
result = stdout.rstrip('\n')
|
|
||||||
|
|
||||||
except OSError, e:
|
|
||||||
raise OSError("Cannot detect routing-stack")
|
|
||||||
|
|
||||||
return result
|
|
Loading…
Reference in New Issue
Block a user