diff options
| -rw-r--r-- | data/templates/frr/bgpd.frr.j2 | 3 | ||||
| -rw-r--r-- | interface-definitions/include/bgp/afi-sid.xml.i | 36 | ||||
| -rw-r--r-- | interface-definitions/include/bgp/protocol-common-config.xml.i | 2 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_protocols_bgp.py | 23 | ||||
| -rwxr-xr-x | src/conf_mode/protocols_bgp.py | 4 | 
5 files changed, 67 insertions, 1 deletions
| diff --git a/data/templates/frr/bgpd.frr.j2 b/data/templates/frr/bgpd.frr.j2 index 679ba8b04..f3ae56903 100644 --- a/data/templates/frr/bgpd.frr.j2 +++ b/data/templates/frr/bgpd.frr.j2 @@ -436,6 +436,9 @@ router bgp {{ system_as }} {{ 'vrf ' ~ vrf if vrf is vyos_defined }}  {%         if afi_config.route_map.vpn.import is vyos_defined %}    route-map vpn import {{ afi_config.route_map.vpn.import }}  {%         endif %} +{%         if afi_config.sid.vpn.export is vyos_defined %} + sid vpn export {{ afi_config.sid.vpn.export }} +{%         endif %}  {%         if afi_config.vni is vyos_defined %}  {%             for vni, vni_config in afi_config.vni.items() %}    vni {{ vni }} diff --git a/interface-definitions/include/bgp/afi-sid.xml.i b/interface-definitions/include/bgp/afi-sid.xml.i new file mode 100644 index 000000000..38a3dcf9b --- /dev/null +++ b/interface-definitions/include/bgp/afi-sid.xml.i @@ -0,0 +1,36 @@ +<!-- include start from bgp/sid.xml.i --> +<node name="sid"> +    <properties> +      <help>SID value for VRF</help> +    </properties> +    <children> +      <node name="vpn"> +        <properties> +          <help>Between current VRF and VPN</help> +        </properties> +        <children> +          <leafNode name="export"> +            <properties> +              <help>For routes leaked from current VRF to VPN</help> +              <completionHelp> +                <list>auto</list> +              </completionHelp> +              <valueHelp> +                <format>u32:1-1048575</format> +                <description>SID allocation index</description> +              </valueHelp> +              <valueHelp> +                <format>auto</format> +                <description>Automatically assign a label</description> +              </valueHelp> +              <constraint> +                <regex>auto</regex> +                <validator name="numeric" argument="--range 1-1048575"/> +              </constraint> +            </properties> +          </leafNode> +        </children> +      </node> +    </children> +  </node> +  <!-- include end --> diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i index bb35efe94..51daf4e8b 100644 --- a/interface-definitions/include/bgp/protocol-common-config.xml.i +++ b/interface-definitions/include/bgp/protocol-common-config.xml.i @@ -188,6 +188,7 @@              </leafNode>            </children>          </node> +        #include <include/bgp/afi-sid.xml.i>        </children>      </node>      <node name="ipv4-multicast"> @@ -555,6 +556,7 @@              </leafNode>            </children>          </node> +        #include <include/bgp/afi-sid.xml.i>        </children>      </node>      <node name="ipv6-multicast"> diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py index d5efae12c..0e9ac4f2d 100755 --- a/smoketest/scripts/cli/test_protocols_bgp.py +++ b/smoketest/scripts/cli/test_protocols_bgp.py @@ -1142,7 +1142,11 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          self.cli_set(base_path + ['srv6', 'locator', locator_name])          self.cli_set(base_path + ['sid', 'vpn', 'per-vrf', 'export', sid]) - +        self.cli_set(base_path + ['address-family', 'ipv4-unicast', 'sid', 'vpn', 'export', sid]) +        # verify() - SID per VRF and SID per address-family are mutually exclusive! +        with self.assertRaises(ConfigSessionError): +            self.cli_commit() +        self.cli_delete(base_path + ['address-family', 'ipv4-unicast', 'sid'])          self.cli_commit()          frrconfig = self.getFRRconfig(f'router bgp {ASN}') @@ -1151,6 +1155,23 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          self.assertIn(f'  locator {locator_name}', frrconfig)          self.assertIn(f' sid vpn per-vrf export {sid}', frrconfig) +        # Now test AFI SID +        self.cli_delete(base_path + ['sid']) +        self.cli_set(base_path + ['address-family', 'ipv4-unicast', 'sid', 'vpn', 'export', sid]) +        self.cli_set(base_path + ['address-family', 'ipv6-unicast', 'sid', 'vpn', 'export', sid]) + +        self.cli_commit() + +        frrconfig = self.getFRRconfig(f'router bgp {ASN}') +        self.assertIn(f'router bgp {ASN}', frrconfig) +        self.assertIn(f' segment-routing srv6', frrconfig) +        self.assertIn(f'  locator {locator_name}', frrconfig) + +        afiv4_config = self.getFRRconfig(' address-family ipv4 unicast') +        self.assertIn(f' sid vpn export {sid}', afiv4_config) +        afiv6_config = self.getFRRconfig(' address-family ipv6 unicast') +        self.assertIn(f' sid vpn export {sid}', afiv6_config) +      def test_bgp_25_ipv4_ipv6_labeled_unicast_peer_group(self):          pg_ipv4 = 'foo4'          pg_ipv6 = 'foo6' diff --git a/src/conf_mode/protocols_bgp.py b/src/conf_mode/protocols_bgp.py index 89e2aab8c..e8bb11828 100755 --- a/src/conf_mode/protocols_bgp.py +++ b/src/conf_mode/protocols_bgp.py @@ -542,6 +542,10 @@ def verify(bgp):                      tmp = dict_search(f'route_map.vpn.{export_import}', afi_config)                      if tmp: verify_route_map(tmp, bgp) +                # per-vrf sid and per-af sid are mutually exclusive +                if 'sid' in afi_config and 'sid' in bgp: +                    raise ConfigError('SID per VRF and SID per address-family are mutually exclusive!') +              # Checks only required for L2VPN EVPN              if afi in ['l2vpn_evpn']:                  if 'vni' in afi_config: | 
