From 5950316b81cc89bd4db113f3e4ded994fe8d7a4f Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan Date: Thu, 14 May 2020 15:46:27 -0700 Subject: [PATCH 1/5] The following changes for multi-npu platforms are done - Set the type in device_metadata for asic configuration to be same as host - Set the admin-status of internal bgp sessions as up Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 19 +++++++++++++++++-- .../tests/test_multinpu_cfggen.py | 4 ++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 1f99bb16c8cd..fdc8a36f5da9 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -38,7 +38,7 @@ FRONTEND_ASIC_SUB_ROLE = 'FrontEnd' BACKEND_ASIC_SUB_ROLE = 'BackEnd' BACKEND_ASIC_INTERFACE_NAME_PREFIX = 'Ethernet-BP' - +INTERNAL_BGP_SESSION_NAME_PREFIX = 'ASIC' # Default Virtual Network Index (VNI) vni_default = 8000 @@ -749,6 +749,17 @@ def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role): return filter_acls +def enable_internal_bgp_session(bgp_sessions): + ''' + In Multi-NPU session the internal sessions will always be up. + So adding the admin-status 'up' configuration to bgp sessions + ''' + + for peer_ip in bgp_sessions.keys(): + session_name = bgp_sessions[peer_ip]['name'] + if session_name.startswith(INTERNAL_BGP_SESSION_NAME_PREFIX): + bgp_sessions[peer_ip].update({'admin_status': 'up'}) + ############################################################################### # # Main functions @@ -842,6 +853,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None): (intfs, lo_intfs, mvrf, mgmt_intf, vlans, vlan_members, pcs, pc_members, acls, vni) = parse_dpg(child, asic_name) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name) + enable_internal_bgp_session(bgp_sessions) elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, port_speed_png) = parse_asic_png(child, asic_name, hostname) elif child.tag == str(QName(ns, "MetadataDeclaration")): @@ -851,6 +863,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None): elif child.tag == str(QName(ns, "DeviceInfos")): (port_speeds_default, port_descriptions) = parse_deviceinfo(child, hwsku) + # set the host device type in asic metadata also + device_type = devices[hostname]['type'] + if asic_name is None: current_device = [devices[key] for key in devices if key.lower() == hostname.lower()][0] else: @@ -864,7 +879,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None): 'docker_routing_config_mode': docker_routing_config_mode, 'hostname': hostname, 'hwsku': hwsku, - 'type': current_device['type'] + 'type': device_type } } # for this hostname, if sub_role is defined, add sub_role in diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index 0ef29eb6d9b4..890a746c58c4 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -9,7 +9,7 @@ ASIC_SKU = 'multi-npu-asic' NUM_ASIC = 4 HOSTNAME = 'multi_npu_platform_01' - +DEVICE_TYPE = 'LeafRouter' class TestMultiNpuCfgGen(TestCase): @@ -215,7 +215,7 @@ def test_device_asic_metadata(self): asic_name = "asic{}".format(asic) self.assertEqual(output['localhost']['hostname'], 'multi_npu_platform_01') self.assertEqual(output['localhost']['asic_name'], asic_name) - self.assertEqual(output['localhost']['type'], 'Asic') + self.assertEqual(output['localhost']['type'], DEVICE_TYPE) if asic == 0 or asic == 1: self.assertEqual(output['localhost']['sub_role'], 'FrontEnd') else: From bd511409b04e3bd6953e0ae9eaa3f792d51f4b50 Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan Date: Mon, 18 May 2020 12:16:10 -0700 Subject: [PATCH 2/5] minor fix Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index fdc8a36f5da9..5560d294f7a6 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -864,8 +864,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None): (port_speeds_default, port_descriptions) = parse_deviceinfo(child, hwsku) # set the host device type in asic metadata also - device_type = devices[hostname]['type'] - + device_type = [devices[key]['type'] for key in devices if key.lower() == hostname.lower()][0] if asic_name is None: current_device = [devices[key] for key in devices if key.lower() == hostname.lower()][0] else: From 0f83578c2a051a56c39bbe914c392a7d02b6eb90 Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan Date: Mon, 18 May 2020 12:34:47 -0700 Subject: [PATCH 3/5] minor changes in the test Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/tests/test_multinpu_cfggen.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index 890a746c58c4..c3307b482b79 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -197,16 +197,16 @@ def test_frontend_bgp_neighbor(self): output = json.loads(self.run_script(argument)) self.assertDictEqual(output, \ {'10.0.0.1': {'rrclient': 0, 'name': '01T2', 'local_addr': '10.0.0.0', 'nhopself': 0, 'holdtime': '10', 'asn': '65200', 'keepalive': '3'}, - '10.1.0.0': {'rrclient': 0, 'name': 'ASIC2', 'local_addr': '10.1.0.1', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}, + '10.1.0.0': {'rrclient': 0, 'name': 'ASIC2', 'local_addr': '10.1.0.1', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'}, 'fc00::2': {'rrclient': 0, 'name': '01T2', 'local_addr': 'fc00::1', 'nhopself': 0, 'holdtime': '10', 'asn': '65200', 'keepalive': '3'}, - '10.1.0.2': {'rrclient': 0, 'name': 'ASIC3', 'local_addr': '10.1.0.3', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}}) + '10.1.0.2': {'rrclient': 0, 'name': 'ASIC3', 'local_addr': '10.1.0.3', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'}}) def test_backend_asic_bgp_neighbor(self): argument = "-m {} -p {} -n asic3 --var-json \"BGP_NEIGHBOR\"".format(self.sample_graph, self.port_config[3]) output = json.loads(self.run_script(argument)) self.assertDictEqual(output, \ - {'10.1.0.7': {'rrclient': 0, 'name': 'ASIC1', 'local_addr': '10.1.0.6', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}, - '10.1.0.3': {'rrclient': 0, 'name': 'ASIC0', 'local_addr': '10.1.0.2', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}}) + {'10.1.0.7': {'rrclient': 0, 'name': 'ASIC1', 'local_addr': '10.1.0.6', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'}, + '10.1.0.3': {'rrclient': 0, 'name': 'ASIC0', 'local_addr': '10.1.0.2', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'}}) def test_device_asic_metadata(self): argument = "-m {} --var-json DEVICE_METADATA".format(self.sample_graph) From 3f8e4240c613d6d9c34a1a68bd7b1156e17b8eca Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan Date: Tue, 19 May 2020 16:47:21 -0700 Subject: [PATCH 4/5] address review comment Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 5560d294f7a6..f18d3b355ab0 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -749,15 +749,19 @@ def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role): return filter_acls -def enable_internal_bgp_session(bgp_sessions): +def enable_internal_bgp_session(bgp_sessions, filename, asic_name): ''' In Multi-NPU session the internal sessions will always be up. So adding the admin-status 'up' configuration to bgp sessions + BGP session between FrontEnd and BackEnd Asics are internal bgp sessions ''' + local_sub_role = parse_asic_sub_role(filename, asic_name) for peer_ip in bgp_sessions.keys(): - session_name = bgp_sessions[peer_ip]['name'] - if session_name.startswith(INTERNAL_BGP_SESSION_NAME_PREFIX): + peer_name = bgp_sessions[peer_ip]['name'] + peer_sub_role = parse_asic_sub_role(filename, peer_name) + if ((local_sub_role == FRONTEND_ASIC_SUB_ROLE and peer_sub_role == BACKEND_ASIC_SUB_ROLE) or + (local_sub_role == BACKEND_ASIC_SUB_ROLE and peer_sub_role == FRONTEND_ASIC_SUB_ROLE)): bgp_sessions[peer_ip].update({'admin_status': 'up'}) ############################################################################### @@ -853,7 +857,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None): (intfs, lo_intfs, mvrf, mgmt_intf, vlans, vlan_members, pcs, pc_members, acls, vni) = parse_dpg(child, asic_name) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name) - enable_internal_bgp_session(bgp_sessions) + enable_internal_bgp_session(bgp_sessions, filename, asic_name) elif child.tag == str(QName(ns, "PngDec")): (neighbors, devices, port_speed_png) = parse_asic_png(child, asic_name, hostname) elif child.tag == str(QName(ns, "MetadataDeclaration")): From a82158f9dd9c35b797574f8d0dd01e2915ec96b7 Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan Date: Wed, 20 May 2020 18:00:42 -0700 Subject: [PATCH 5/5] address review comment Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index f18d3b355ab0..3ead38080920 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -38,7 +38,7 @@ FRONTEND_ASIC_SUB_ROLE = 'FrontEnd' BACKEND_ASIC_SUB_ROLE = 'BackEnd' BACKEND_ASIC_INTERFACE_NAME_PREFIX = 'Ethernet-BP' -INTERNAL_BGP_SESSION_NAME_PREFIX = 'ASIC' + # Default Virtual Network Index (VNI) vni_default = 8000