Skip to content

Commit

Permalink
Common functions for Multi ASIC (#4973)
Browse files Browse the repository at this point in the history
Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan arlakshm@microsoft.com

The following common APIs are added for multi ASIC
- an  API to check if a given port is a internal or external port
- an  API to check if a given port-channel is internal or external
- an API to check if a bgp-session is internal or external
- an  API to connect to the config and other dbs in the a given namespace
- added common APIs to the sonic_py_common library.
- update the sample port-config.ini with role column and add corresponding test to verify the ports configuration is - generated properly.
  • Loading branch information
arlakshm authored Aug 14, 2020
1 parent bf3c901 commit 6c89551
Show file tree
Hide file tree
Showing 8 changed files with 355 additions and 42 deletions.
4 changes: 2 additions & 2 deletions src/sonic-config-engine/minigraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from lxml.etree import QName

from portconfig import get_port_config
from sonic_py_common.device_info import get_npu_id_from_name
from sonic_py_common.multi_asic import get_asic_id_from_name

"""minigraph.py
version_added: "1.9"
Expand Down Expand Up @@ -840,7 +840,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw

# hostname is the asic_name, get the asic_id from the asic_name
if asic_name is not None:
asic_id = get_npu_id_from_name(asic_name)
asic_id = get_asic_id_from_name(asic_name)
else:
asic_id = None

Expand Down
8 changes: 4 additions & 4 deletions src/sonic-config-engine/sonic-cfggen
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ from minigraph import parse_device_desc_xml
from minigraph import parse_asic_sub_role
from portconfig import get_port_config, get_port_config_file_name, get_breakout_mode
from sonic_py_common.device_info import get_platform, get_system_mac
from sonic_py_common.device_info import get_npu_id_from_name, is_multi_npu
from sonic_py_common.multi_asic import get_asic_id_from_name, is_multi_asic
from config_samples import generate_sample_config
from config_samples import get_available_config
from swsssdk import SonicV2Connector, ConfigDBConnector, SonicDBConfig
Expand Down Expand Up @@ -240,8 +240,8 @@ def _get_jinja2_env(paths):
env.filters['ip_network'] = ip_network
for attr in ['ip', 'network', 'prefixlen', 'netmask', 'broadcast']:
env.filters[attr] = partial(prefix_attr, attr)
# Pass the is_multi_npu function as global
env.globals['multi_asic'] = is_multi_npu
# Pass the is_multi_asic function as global
env.globals['multi_asic'] = is_multi_asic

return env

Expand Down Expand Up @@ -284,7 +284,7 @@ def main():
asic_name = args.namespace
asic_id = None
if asic_name is not None:
asic_id = get_npu_id_from_name(asic_name)
asic_id = get_asic_id_from_name(asic_name)


# Load the database config for the namespace from global database json
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# name lanes alias asic_port_name
Ethernet0 33,34,35,36 Ethernet1/1 Eth0-ASIC0
Ethernet4 29,30,31,32 Ethernet1/2 Eth1-ASIC0
Ethernet8 41,42,43,44 Ethernet1/3 Eth2-ASIC0
Ethernet12 37,38,39,40 Ethernet1/4 Eth3-ASIC0
Ethernet-BP0 13,14,15,16 Ethernet-BP0 Eth4-ASIC0
Ethernet-BP4 17,18,19,20 Ethernet-BP4 Eth5-ASIC0
Ethernet-BP8 21,22,23,24 Ethernet-BP8 Eth6-ASIC0
Ethernet-BP12 25,26,27,28 Ethernet-BP12 Eth7-ASIC0
# name lanes alias index asic_port_name role
Ethernet0 33,34,35,36 Ethernet1/1 0 Eth0-ASIC0 Ext
Ethernet4 29,30,31,32 Ethernet1/2 1 Eth1-ASIC0 Ext
Ethernet8 41,42,43,44 Ethernet1/3 2 Eth2-ASIC0 Ext
Ethernet12 37,38,39,40 Ethernet1/4 3 Eth3-ASIC0 Ext
Ethernet-BP0 13,14,15,16 Ethernet-BP0 0 Eth4-ASIC0 Int
Ethernet-BP4 17,18,19,20 Ethernet-BP4 1 Eth5-ASIC0 Int
Ethernet-BP8 21,22,23,24 Ethernet-BP8 2 Eth6-ASIC0 Int
Ethernet-BP12 25,26,27,28 Ethernet-BP12 3 Eth7-ASIC0 Int
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# name lanes alias asic_port_name
Ethernet16 33,34,35,36 Ethernet1/5 Eth0-ASIC1
Ethernet20 29,30,31,32 Ethernet1/6 Eth1-ASIC1
Ethernet24 41,42,43,44 Ethernet1/7 Eth2-ASIC1
Ethernet28 37,38,39,40 Ethernet1/8 Eth3-ASIC1
Ethernet-BP16 13,14,15,16 Ethernet-BP16 Eth4-ASIC1
Ethernet-BP20 17,18,19,20 Ethernet-BP20 Eth5-ASIC1
Ethernet-BP24 21,22,23,24 Ethernet-BP24 Eth6-ASIC1
Ethernet-BP28 25,26,27,28 Ethernet-BP28 Eth7-ASIC1
# name lanes alias index asic_port_name role
Ethernet16 33,34,35,36 Ethernet1/5 4 Eth0-ASIC1 Ext
Ethernet20 29,30,31,32 Ethernet1/6 5 Eth1-ASIC1 Ext
Ethernet24 41,42,43,44 Ethernet1/7 6 Eth2-ASIC1 Ext
Ethernet28 37,38,39,40 Ethernet1/8 7 Eth3-ASIC1 Ext
Ethernet-BP16 13,14,15,16 Ethernet-BP16 4 Eth4-ASIC1 Int
Ethernet-BP20 17,18,19,20 Ethernet-BP20 5 Eth5-ASIC1 Int
Ethernet-BP24 21,22,23,24 Ethernet-BP24 6 Eth6-ASIC1 Int
Ethernet-BP28 25,26,27,28 Ethernet-BP28 7 Eth7-ASIC1 Int
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# name lanes alias asic_port_name
Ethernet-BP256 61,62,63,64 Ethernet-BP256 Eth0-ASIC2
Ethernet-BP260 57,58,59,60 Ethernet-BP260 Eth1-ASIC2
Ethernet-BP264 53,54,55,56 Ethernet-BP264 Eth2-ASIC2
Ethernet-BP268 49,50,51,52 Ethernet-BP268 Eth3-ASIC2
Ethernet-BP272 45,46,47,48 Ethernet-BP272 Eth4-ASIC2
Ethernet-BP276 41,42,43,44 Ethernet-BP276 Eth5-ASIC2
Ethernet-BP280 37,38,39,40 Ethernet-BP280 Eth6-ASIC2
Ethernet-BP284 33,34,35,36 Ethernet-BP284 Eth7-ASIC2
# name lanes alias index asic_port_name role
Ethernet-BP256 61,62,63,64 Ethernet-BP256 8 Eth0-ASIC2 Int
Ethernet-BP260 57,58,59,60 Ethernet-BP260 9 Eth1-ASIC2 Int
Ethernet-BP264 53,54,55,56 Ethernet-BP264 10 Eth2-ASIC2 Int
Ethernet-BP268 49,50,51,52 Ethernet-BP268 11 Eth3-ASIC2 Int
Ethernet-BP272 45,46,47,48 Ethernet-BP272 12 Eth4-ASIC2 Int
Ethernet-BP276 41,42,43,44 Ethernet-BP276 13 Eth5-ASIC2 Int
Ethernet-BP280 37,38,39,40 Ethernet-BP280 14 Eth6-ASIC2 Int
Ethernet-BP284 33,34,35,36 Ethernet-BP284 15 Eth7-ASIC2 Int
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# name lanes alias asic_port_name
Ethernet-BP384 29,30,31,32 Ethernet-BP384 Eth0-ASIC3
Ethernet-BP388 25,26,27,28 Ethernet-BP388 Eth1-ASIC3
Ethernet-BP392 21,22,23,24 Ethernet-BP392 Eth2-ASIC3
Ethernet-BP396 17,18,19,20 Ethernet-BP396 Eth3-ASIC3
Ethernet-BP400 13,14,15,16 Ethernet-BP400 Eth4-ASIC3
Ethernet-BP404 9,10,11,12 Ethernet-BP404 Eth5-ASIC3
Ethernet-BP408 5,6,7,8 Ethernet-BP408 Eth6-ASIC3
Ethernet-BP412 1,2,3,4 Ethernet-BP412 Eth7-ASIC3
# name lanes alias index asic_port_name role
Ethernet-BP384 29,30,31,32 Ethernet-BP384 16 Eth0-ASIC3 Int
Ethernet-BP388 25,26,27,28 Ethernet-BP388 17 Eth1-ASIC3 Int
Ethernet-BP392 21,22,23,24 Ethernet-BP392 18 Eth2-ASIC3 Int
Ethernet-BP396 17,18,19,20 Ethernet-BP396 19 Eth3-ASIC3 Int
Ethernet-BP400 13,14,15,16 Ethernet-BP400 20 Eth4-ASIC3 Int
Ethernet-BP404 9,10,11,12 Ethernet-BP404 21 Eth5-ASIC3 Int
Ethernet-BP408 5,6,7,8 Ethernet-BP408 22 Eth6-ASIC3 Int
Ethernet-BP412 1,2,3,4 Ethernet-BP412 23 Eth7-ASIC3 Int
13 changes: 13 additions & 0 deletions src/sonic-config-engine/tests/test_multinpu_cfggen.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,19 @@ def test_backend_asic_portchannel_intf(self):
self.assertListEqual(output.keys(), \
['PortChannel4013', 'PortChannel4013|10.1.0.2/31', 'PortChannel4014', 'PortChannel4014|10.1.0.6/31'])

def test_frontend_asic_ports(self):
argument = "-m {} -p {} -n asic0 --var-json \"PORT\"".format(self.sample_graph, self.port_config[0])
output = json.loads(self.run_script(argument))
self.assertDictEqual(output, \
{"Ethernet0": { "admin_status": "up", "alias": "Ethernet1/1", "asic_port_name": "Eth0-ASIC0", "description": "01T2:Ethernet1", "index": "0", "lanes": "33,34,35,36", "mtu": "9100", "pfc_asym": "off", "role": "Ext", "speed": "40000" },
"Ethernet4": { "admin_status": "up", "alias": "Ethernet1/2", "asic_port_name": "Eth1-ASIC0", "description": "01T2:Ethernet2", "index": "1", "lanes": "29,30,31,32", "mtu": "9100", "pfc_asym": "off", "role": "Ext", "speed": "40000" },
"Ethernet8": { "alias": "Ethernet1/3", "asic_port_name": "Eth2-ASIC0", "description": "Ethernet1/3", "index": "2", "lanes": "41,42,43,44", "mtu": "9100", "pfc_asym": "off", "role": "Ext", "speed": "40000" },
"Ethernet12": { "alias": "Ethernet1/4", "asic_port_name": "Eth3-ASIC0", "description": "Ethernet1/4", "index": "3", "lanes": "37,38,39,40", "mtu": "9100", "pfc_asym": "off", "role": "Ext", "speed": "40000" },
"Ethernet-BP0": { "admin_status": "up", "alias": "Ethernet-BP0", "asic_port_name": "Eth4-ASIC0", "description": "ASIC2:Eth0-ASIC2", "index": "0", "lanes": "13,14,15,16", "mtu": "9100", "pfc_asym": "off", "role": "Int", "speed": "40000" },
"Ethernet-BP4": { "admin_status": "up", "alias": "Ethernet-BP4", "asic_port_name": "Eth5-ASIC0", "description": "ASIC2:Eth1-ASIC2", "index": "1", "lanes": "17,18,19,20", "mtu": "9100", "pfc_asym": "off", "role": "Int", "speed": "40000" },
"Ethernet-BP8": { "admin_status": "up", "alias": "Ethernet-BP8", "asic_port_name": "Eth6-ASIC0", "description": "ASIC3:Eth0-ASIC3", "index": "2", "lanes": "21,22,23,24", "mtu": "9100", "pfc_asym": "off", "role": "Int", "speed": "40000" },
"Ethernet-BP12": { "admin_status": "up", "alias": "Ethernet-BP12", "asic_port_name": "Eth7-ASIC0", "description": "ASIC3:Eth1-ASIC3", "index": "3", "lanes": "25,26,27,28", "mtu": "9100", "pfc_asym": "off", "role": "Int", "speed": "40000" }})

def test_frontend_asic_device_neigh(self):
argument = "-m {} -p {} -n asic0 --var-json \"DEVICE_NEIGHBOR\"".format(self.sample_graph, self.port_config[0])
output = json.loads(self.run_script(argument))
Expand Down
Loading

0 comments on commit 6c89551

Please sign in to comment.