From 30b6668b7d7a0342d6e0db185017a45529c026a2 Mon Sep 17 00:00:00 2001 From: abdosi <58047199+abdosi@users.noreply.github.com> Date: Fri, 26 Feb 2021 17:05:15 -0800 Subject: [PATCH] Changes in FRR temapltes for multi-asic (#6901) 1. Made the command next-hop-self force only applicable on back-end asic bgp. This is done so that BGPL iBGP session running on backend can send e-BGP learn nexthop. Back end asic FRR is able to recursively resolve the eBGP nexthop in its routing table since it knows about all the connected routes advertise from front end asic. 2. Made all front-end asic bgp use global loopback ip (Loopback0) as router id and back end asic bgp use Loopbacl4096 as ruter-id and originator id for Route-Reflector. This is done so that routes learnt by external peer do not see Loopback4096 as router id in show ip bgp output. 3. To handle above change need to pass Loopback4096 from BGP manager for jinja2 template generation. This was missing and this change/fix is needed for this also https://github.com/Azure/sonic-buildimage/blob/master/dockers/docker-fpm-frr/frr/bgpd/templates/dynamic/instance.conf.j2#L27 4. Enhancement to add mult_asic specific bgpd template generation unit test cases. --- .../docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 | 7 +- .../bgpd/templates/internal/instance.conf.j2 | 3 +- .../bgpd/templates/internal/policies.conf.j2 | 7 +- src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py | 4 +- .../instance.conf/result_back_v4.conf | 2 +- .../instance.conf/result_back_v6.conf | 2 +- .../instance.conf/result_front_v4.conf | 1 - .../instance.conf/result_front_v6.conf | 1 - .../internal/policies.conf/param_back.json | 6 +- .../internal/policies.conf/result_back.conf | 2 +- .../internal/policies.conf/result_front.conf | 2 +- .../data/sonic-cfggen/bgpd.conf.j2/all.conf | 4 + .../data/sonic-cfggen/bgpd.conf.j2/all.json | 4 +- .../sonic-cfggen/bgpd.main.conf.j2/all.conf | 4 + .../sonic-cfggen/bgpd.main.conf.j2/all.json | 4 +- .../bgpd.main.conf.j2/defaults.conf | 4 + .../bgpd.main.conf.j2/defaults.json | 4 +- .../data/sonic-cfggen/frr.conf.j2/all.conf | 7 +- .../data/sonic-cfggen/frr.conf.j2/all.json | 6 +- src/sonic-config-engine/sonic-cfggen | 4 +- .../py2/bgpd_frr_backend_asic.conf | 78 +++++++++++++++++ .../py2/bgpd_frr_frontend_asic.conf | 84 +++++++++++++++++++ .../py3/bgpd_frr_backend_asic.conf | 78 +++++++++++++++++ .../py3/bgpd_frr_frontend_asic.conf | 84 +++++++++++++++++++ .../tests/test_multinpu_cfggen.py | 23 +++++ 25 files changed, 399 insertions(+), 26 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_backend_asic.conf create mode 100644 src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_frontend_asic.conf create mode 100644 src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_backend_asic.conf create mode 100644 src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_frontend_asic.conf diff --git a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 index 9568d48215..cf0b0f0077 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 @@ -33,6 +33,7 @@ ipv6 prefix-list LOCAL_VLAN_IPV6_PREFIX seq {{ loop.index * 5 }} permit {{ prefi {% if DEVICE_METADATA['localhost']['sub_role'] == 'FrontEnd' or DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} route-map HIDE_INTERNAL permit 10 set community local-AS +{% set multi_asic = True %} ! {% endif %} ! @@ -54,7 +55,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endif %} ! {# set router-id #} -{% if multi_asic() %} +{% if DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} bgp router-id {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") | ip }} {% else %} bgp router-id {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }} @@ -62,7 +63,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} ! {# advertise loopback #} network {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/32 -{% if multi_asic() %} +{% if multi_asic is defined %} network {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") | ip }}/32 route-map HIDE_INTERNAL {% endif %} ! @@ -71,7 +72,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/64 exit-address-family {% endif %} -{% if multi_asic() %} +{% if multi_asic is defined %} {% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") != 'None' %} address-family ipv6 network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") | ip }}/64 route-map HIDE_INTERNAL diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 index e0e23b7f60..198c4bffc3 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 @@ -10,6 +10,7 @@ neighbor {{ neighbor_addr }} peer-group INTERNAL_PEER_V4 ! {% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + neighbor {{ neighbor_addr }} next-hop-self force neighbor {{ neighbor_addr }} route-map FROM_BGP_INTERNAL_PEER_V4 in {% endif %} ! @@ -18,6 +19,7 @@ neighbor {{ neighbor_addr }} peer-group INTERNAL_PEER_V6 ! {% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + neighbor {{ neighbor_addr }} next-hop-self force neighbor {{ neighbor_addr }} route-map FROM_BGP_INTERNAL_PEER_V6 in {% endif %} {% endif %} @@ -26,7 +28,6 @@ neighbor {{ neighbor_addr }} route-reflector-client {% endif %} ! - neighbor {{ neighbor_addr }} next-hop-self force ! neighbor {{ neighbor_addr }} activate exit-address-family diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 index 81d3b00411..855a686356 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 @@ -2,6 +2,7 @@ ! template: bgpd/templates/internal/policies.conf.j2 ! ! +{% from "common/functions.conf.j2" import get_ipv4_loopback_address %} ! route-map FROM_BGP_INTERNAL_PEER_V4 permit 100 ! @@ -9,8 +10,8 @@ route-map TO_BGP_INTERNAL_PEER_V4 permit 100 ! ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 1 - on-match next set ipv6 next-hop prefer-global + on-match next ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 100 ! @@ -18,10 +19,10 @@ route-map TO_BGP_INTERNAL_PEER_V6 permit 100 ! {% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} route-map FROM_BGP_INTERNAL_PEER_V4 permit 2 - set originator-id {{ loopback0_ipv4 | ip }} + set originator-id {{ get_ipv4_loopback_address(CONFIG_DB__LOOPBACK_INTERFACE, "Loopback4096") | ip }} ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 2 - set originator-id {{ loopback0_ipv4 | ip }} + set originator-id {{ get_ipv4_loopback_address(CONFIG_DB__LOOPBACK_INTERFACE, "Loopback4096") | ip }} {% endif %} ! ! end of template: bgpd/templates/internal/policies.conf.j2 diff --git a/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py b/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py index f6108bfb61..3ab7dba4f6 100644 --- a/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py +++ b/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py @@ -191,6 +191,8 @@ class BGPPeerMgrBase(Manager): 'neighbor_addr': nbr, 'bgp_session': data, 'loopback0_ipv4': lo0_ipv4, + 'CONFIG_DB__LOOPBACK_INTERFACE':{ tuple(key.split('|')) : {} for key in self.directory.get_slot("CONFIG_DB", swsscommon.CFG_LOOPBACK_INTERFACE_TABLE_NAME) + if '|' in key } } if self.check_neig_meta: neigmeta = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_DEVICE_NEIGHBOR_METADATA_TABLE_NAME) @@ -384,4 +386,4 @@ class BGPPeerMgrBase(Manager): log_crit("Can't read vrf '%s' neighbors: %s" % (vrf, str(err))) raise Exception("Can't read vrf '%s' neighbors: %s" % (vrf, str(err))) - return peers \ No newline at end of file + return peers diff --git a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v4.conf b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v4.conf index fc7b82a64a..63958c1d04 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v4.conf +++ b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v4.conf @@ -6,9 +6,9 @@ neighbor 10.10.10.10 timers 3 10 address-family ipv4 neighbor 10.10.10.10 peer-group INTERNAL_PEER_V4 + neighbor 10.10.10.10 next-hop-self force neighbor 10.10.10.10 route-map FROM_BGP_INTERNAL_PEER_V4 in neighbor 10.10.10.10 route-reflector-client - neighbor 10.10.10.10 next-hop-self force neighbor 10.10.10.10 activate exit-address-family ! diff --git a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v6.conf b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v6.conf index 74cececad9..900cf4c399 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v6.conf +++ b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_back_v6.conf @@ -6,9 +6,9 @@ neighbor fc::10 timers 3 10 address-family ipv6 neighbor fc::10 peer-group INTERNAL_PEER_V6 + neighbor fc::10 next-hop-self force neighbor fc::10 route-map FROM_BGP_INTERNAL_PEER_V6 in neighbor fc::10 route-reflector-client - neighbor fc::10 next-hop-self force neighbor fc::10 activate exit-address-family ! diff --git a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v4.conf b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v4.conf index 95eb985b15..ffd9977f9f 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v4.conf +++ b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v4.conf @@ -6,7 +6,6 @@ neighbor 10.10.10.10 timers 3 10 address-family ipv4 neighbor 10.10.10.10 peer-group INTERNAL_PEER_V4 - neighbor 10.10.10.10 next-hop-self force neighbor 10.10.10.10 activate exit-address-family ! diff --git a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v6.conf b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v6.conf index a4a4648e48..5b4a2137dd 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v6.conf +++ b/src/sonic-bgpcfgd/tests/data/internal/instance.conf/result_front_v6.conf @@ -6,7 +6,6 @@ neighbor fc::10 timers 3 10 address-family ipv6 neighbor fc::10 peer-group INTERNAL_PEER_V6 - neighbor fc::10 next-hop-self force neighbor fc::10 activate exit-address-family ! diff --git a/src/sonic-bgpcfgd/tests/data/internal/policies.conf/param_back.json b/src/sonic-bgpcfgd/tests/data/internal/policies.conf/param_back.json index 148456fe96..37e54d785e 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/policies.conf/param_back.json +++ b/src/sonic-bgpcfgd/tests/data/internal/policies.conf/param_back.json @@ -4,5 +4,7 @@ "sub_role": "BackEnd" } }, - "loopback0_ipv4": "10.10.10.10/32" -} \ No newline at end of file + "CONFIG_DB__LOOPBACK_INTERFACE": { + "Loopback4096|10.10.10.10/32": {} + } +} diff --git a/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_back.conf b/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_back.conf index 81bf0808f7..81b5aab193 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_back.conf +++ b/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_back.conf @@ -6,8 +6,8 @@ route-map FROM_BGP_INTERNAL_PEER_V4 permit 100 route-map TO_BGP_INTERNAL_PEER_V4 permit 100 ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 1 - on-match next set ipv6 next-hop prefer-global + on-match next ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 100 ! diff --git a/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_front.conf b/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_front.conf index 94dc55a545..880530a279 100644 --- a/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_front.conf +++ b/src/sonic-bgpcfgd/tests/data/internal/policies.conf/result_front.conf @@ -6,8 +6,8 @@ route-map FROM_BGP_INTERNAL_PEER_V4 permit 100 route-map TO_BGP_INTERNAL_PEER_V4 permit 100 ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 1 - on-match next set ipv6 next-hop prefer-global + on-match next ! route-map FROM_BGP_INTERNAL_PEER_V6 permit 100 ! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.conf index 43a65bd2dd..e2f9964766 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.conf +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.conf @@ -51,10 +51,14 @@ router bgp 55555 bgp router-id 55.55.55.55 ! network 55.55.55.55/32 + network 55.55.55.56/32 route-map HIDE_INTERNAL ! address-family ipv6 network fc00::1/64 exit-address-family + address-family ipv6 + network fc00::2/64 route-map HIDE_INTERNAL + exit-address-family ! network 10.10.10.1/24 address-family ipv6 diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.json index 17e32589d8..bc266ed704 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.json +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.conf.j2/all.json @@ -8,7 +8,9 @@ }, "LOOPBACK_INTERFACE": { "Loopback0|55.55.55.55/32": {}, - "Loopback0|fc00::1/128": {} + "Loopback0|fc00::1/128": {}, + "Loopback4096|55.55.55.56/32": {}, + "Loopback4096|fc00::2/128": {} }, "VLAN_INTERFACE": { "Vlan10|10.10.10.1/24": {}, diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.conf index 4a749516fe..c7f2971fd7 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.conf +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.conf @@ -33,10 +33,14 @@ router bgp 55555 bgp router-id 55.55.55.55 ! network 55.55.55.55/32 + network 55.55.55.56/32 route-map HIDE_INTERNAL ! address-family ipv6 network fc00::1/64 exit-address-family + address-family ipv6 + network fc00::2/64 route-map HIDE_INTERNAL + exit-address-family ! network 10.10.10.1/24 address-family ipv6 diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.json index 3d5d07d95f..c8f0141ec4 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.json +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/all.json @@ -7,7 +7,9 @@ }, "LOOPBACK_INTERFACE": { "Loopback0|55.55.55.55/32": {}, - "Loopback0|fc00::1/128": {} + "Loopback0|fc00::1/128": {}, + "Loopback4096|55.55.55.56/32": {}, + "Loopback4096|fc00::2/128": {} }, "VLAN_INTERFACE": { "Vlan10|10.10.10.1/24": {}, diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.conf index 30fc479d6a..431499ceaf 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.conf +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.conf @@ -33,10 +33,14 @@ router bgp 55555 bgp router-id 55.55.55.55 ! network 55.55.55.55/32 + network 55.55.55.56/32 route-map HIDE_INTERNAL ! address-family ipv6 network fc00::1/64 exit-address-family + address-family ipv6 + network fc00::2/64 route-map HIDE_INTERNAL + exit-address-family ! network 10.10.10.1/24 address-family ipv6 diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.json index e841437650..5b30406668 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.json +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/defaults.json @@ -7,7 +7,9 @@ }, "LOOPBACK_INTERFACE": { "Loopback0|55.55.55.55/32": {}, - "Loopback0|fc00::1/128": {} + "Loopback0|fc00::1/128": {}, + "Loopback4096|55.55.55.56/32": {}, + "Loopback4096|fc00::2/128": {} }, "VLAN_INTERFACE": { "Vlan10|10.10.10.1/24": {}, diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.conf index 37b7691ad9..e977d2b5cf 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.conf +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.conf @@ -36,11 +36,10 @@ link-detect ip route 0.0.0.0/0 10.10.10.1 200 !! ! -! ! add static ipv6 /64 loopback route to allow bgpd to advertise the loopback route prefix ipv6 route fc00::/64 Loopback0 -! !! +! ! template: bgpd/bgpd.main.conf.j2 ! ! bgp multiple-instance @@ -75,10 +74,14 @@ router bgp 55555 bgp router-id 55.55.55.55 ! network 55.55.55.55/32 + network 55.55.55.56/32 route-map HIDE_INTERNAL ! address-family ipv6 network fc00::1/64 exit-address-family + address-family ipv6 + network fc00::2/64 route-map HIDE_INTERNAL + exit-address-family ! network 10.10.10.1/24 address-family ipv6 diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.json index d81eba2b0f..92143a2a9d 100644 --- a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.json +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/frr.conf.j2/all.json @@ -21,7 +21,9 @@ }, "LOOPBACK_INTERFACE": { "Loopback0|55.55.55.55/32": {}, - "Loopback0|fc00::1/128": {} + "Loopback0|fc00::1/128": {}, + "Loopback4096|55.55.55.56/32": {}, + "Loopback4096|fc00::2/128": {} }, "VLAN_INTERFACE": { "Vlan10|10.10.10.1/24": {}, @@ -43,4 +45,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 0f9ffafad6..b0a6295ad1 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -41,7 +41,7 @@ from functools import partial from minigraph import minigraph_encoder, parse_xml, parse_device_desc_xml, parse_asic_sub_role from portconfig import get_port_config, get_breakout_mode from redis_bcc import RedisBytecodeCache -from sonic_py_common.multi_asic import get_asic_id_from_name, is_multi_asic +from sonic_py_common.multi_asic import get_asic_id_from_name from sonic_py_common import device_info from swsscommon.swsscommon import SonicV2Connector, ConfigDBConnector, SonicDBConfig, ConfigDBPipeConnector @@ -251,8 +251,6 @@ 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_asic function as global - env.globals['multi_asic'] = is_multi_asic return env diff --git a/src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_backend_asic.conf b/src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_backend_asic.conf new file mode 100644 index 0000000000..ce4f4d7ce2 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_backend_asic.conf @@ -0,0 +1,78 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname multi_npu_platform_01 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +agentx +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +! +route-map HIDE_INTERNAL permit 10 + set community local-AS +! +! +router bgp 65100 +! + bgp log-neighbor-changes + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! + bgp graceful-restart restart-time 240 + bgp graceful-restart + bgp graceful-restart preserve-fw-state +! + bgp router-id 8.0.0.5 +! + network 10.1.0.32/32 + network 8.0.0.5/32 route-map HIDE_INTERNAL +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family + address-family ipv6 + network fd00:4::32/64 route-map HIDE_INTERNAL + exit-address-family +! +! +! +! + address-family ipv4 + maximum-paths 64 + exit-address-family + address-family ipv6 + maximum-paths 64 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_frontend_asic.conf b/src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_frontend_asic.conf new file mode 100644 index 0000000000..dcdcc78af0 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py2/bgpd_frr_frontend_asic.conf @@ -0,0 +1,84 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname multi_npu_platform_01 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +agentx +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +! +route-map HIDE_INTERNAL permit 10 + set community local-AS +! +! +router bgp 65100 +! + bgp log-neighbor-changes + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! + bgp graceful-restart restart-time 240 + bgp graceful-restart + bgp graceful-restart preserve-fw-state +! + bgp router-id 10.1.0.32 +! + network 10.1.0.32/32 + network 8.0.0.0/32 route-map HIDE_INTERNAL +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family + address-family ipv6 + network fd00:1::32/64 route-map HIDE_INTERNAL + exit-address-family +! +! +! + address-family ipv4 + redistribute connected route-map HIDE_INTERNAL + exit-address-family + address-family ipv6 + redistribute connected route-map HIDE_INTERNAL + exit-address-family +! + address-family ipv4 + maximum-paths 64 + exit-address-family + address-family ipv6 + maximum-paths 64 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_backend_asic.conf b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_backend_asic.conf new file mode 100644 index 0000000000..ce4f4d7ce2 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_backend_asic.conf @@ -0,0 +1,78 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname multi_npu_platform_01 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +agentx +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +! +route-map HIDE_INTERNAL permit 10 + set community local-AS +! +! +router bgp 65100 +! + bgp log-neighbor-changes + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! + bgp graceful-restart restart-time 240 + bgp graceful-restart + bgp graceful-restart preserve-fw-state +! + bgp router-id 8.0.0.5 +! + network 10.1.0.32/32 + network 8.0.0.5/32 route-map HIDE_INTERNAL +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family + address-family ipv6 + network fd00:4::32/64 route-map HIDE_INTERNAL + exit-address-family +! +! +! +! + address-family ipv4 + maximum-paths 64 + exit-address-family + address-family ipv6 + maximum-paths 64 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_frontend_asic.conf b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_frontend_asic.conf new file mode 100644 index 0000000000..dcdcc78af0 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_frontend_asic.conf @@ -0,0 +1,84 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname multi_npu_platform_01 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +agentx +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +! +route-map HIDE_INTERNAL permit 10 + set community local-AS +! +! +router bgp 65100 +! + bgp log-neighbor-changes + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! + bgp graceful-restart restart-time 240 + bgp graceful-restart + bgp graceful-restart preserve-fw-state +! + bgp router-id 10.1.0.32 +! + network 10.1.0.32/32 + network 8.0.0.0/32 route-map HIDE_INTERNAL +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family + address-family ipv6 + network fd00:1::32/64 route-map HIDE_INTERNAL + exit-address-family +! +! +! + address-family ipv4 + redistribute connected route-map HIDE_INTERNAL + exit-address-family + address-family ipv6 + redistribute connected route-map HIDE_INTERNAL + exit-address-family +! + address-family ipv4 + maximum-paths 64 + exit-address-family + address-family ipv6 + maximum-paths 64 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index 83955925c9..af0e773c16 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -1,3 +1,4 @@ +import filecmp import json import os import shutil @@ -26,6 +27,7 @@ class TestMultiNpuCfgGen(TestCase): self.port_config = [] for asic in range(NUM_ASIC): self.port_config.append(os.path.join(self.test_data_dir, "sample_port_config-{}.ini".format(asic))) + self.output_file = os.path.join(self.test_dir, 'output') def run_script(self, argument, check_stderr=False): print('\n Running sonic-cfggen ' + argument) @@ -47,6 +49,22 @@ class TestMultiNpuCfgGen(TestCase): def run_diff(self, file1, file2): return subprocess.check_output('diff -u {} {} || true'.format(file1, file2), shell=True) + def run_frr_asic_case(self, template, target, asic, port_config): + template_dir = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-frr', "frr") + conf_template = os.path.join(template_dir, template) + constants = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'constants', 'constants.yml') + cmd_args = asic, self.sample_graph, port_config, constants, conf_template, template_dir, self.output_file + cmd = "-n %s -m %s -p %s -y %s -t %s -T %s > %s" % cmd_args + self.run_script(cmd) + + original_filename = os.path.join(self.test_dir, 'sample_output', utils.PYvX_DIR, target) + r = filecmp.cmp(original_filename, self.output_file) + diff_output = self.run_diff(original_filename, self.output_file) if not r else "" + + return r, "Diff:\n" + diff_output + + + def run_script_for_asic(self,argument,asic, port_config=None): argument = "{} -n asic{} ".format(argument, asic) if port_config: @@ -352,3 +370,8 @@ class TestMultiNpuCfgGen(TestCase): } } ) + def test_bgpd_frr_frontendasic(self): + self.assertTrue(*self.run_frr_asic_case('bgpd/bgpd.conf.j2', 'bgpd_frr_frontend_asic.conf', "asic0", self.port_config[0])) + + def test_bgpd_frr_backendasic(self): + self.assertTrue(*self.run_frr_asic_case('bgpd/bgpd.conf.j2', 'bgpd_frr_backend_asic.conf', "asic3", self.port_config[3]))