diff options
| -rw-r--r-- | data/templates/frr/bgpd.frr.j2 | 2 | ||||
| -rw-r--r-- | interface-definitions/include/bgp/protocol-common-config.xml.i | 2 | ||||
| -rw-r--r-- | interface-definitions/include/version/bgp-version.xml.i | 2 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_protocols_bgp.py | 26 | ||||
| -rwxr-xr-x | src/conf_mode/protocols_bgp.py | 8 | ||||
| -rwxr-xr-x | src/migration-scripts/bgp/2-to-3 | 51 | 
6 files changed, 71 insertions, 20 deletions
| diff --git a/data/templates/frr/bgpd.frr.j2 b/data/templates/frr/bgpd.frr.j2 index 7029f39af..2ab7c8596 100644 --- a/data/templates/frr/bgpd.frr.j2 +++ b/data/templates/frr/bgpd.frr.j2 @@ -231,7 +231,7 @@  {% endif %}  {% endmacro %}  ! -router bgp {{ local_as }} {{ 'vrf ' ~ vrf if vrf is vyos_defined }} +router bgp {{ system_as }} {{ 'vrf ' ~ vrf if vrf is vyos_defined }}  {% if parameters.ebgp_requires_policy is vyos_defined %}   bgp ebgp-requires-policy  {% else %} diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i index c1b465e43..d2bcea62a 100644 --- a/interface-definitions/include/bgp/protocol-common-config.xml.i +++ b/interface-definitions/include/bgp/protocol-common-config.xml.i @@ -896,7 +896,7 @@      </tagNode>    </children>  </node> -<leafNode name="local-as"> +<leafNode name="system-as">    <properties>      <help>Autonomous System Number (ASN)</help>      <valueHelp> diff --git a/interface-definitions/include/version/bgp-version.xml.i b/interface-definitions/include/version/bgp-version.xml.i index 15bc5abd4..ced49e729 100644 --- a/interface-definitions/include/version/bgp-version.xml.i +++ b/interface-definitions/include/version/bgp-version.xml.i @@ -1,3 +1,3 @@  <!-- include start from include/version/bgp-version.xml.i --> -<syntaxVersion component='bgp' version='2'></syntaxVersion> +<syntaxVersion component='bgp' version='3'></syntaxVersion>  <!-- include end --> diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py index 009dbc803..f69832cb4 100755 --- a/smoketest/scripts/cli/test_protocols_bgp.py +++ b/smoketest/scripts/cli/test_protocols_bgp.py @@ -46,7 +46,7 @@ neighbor_config = {          'shutdown'         : '',          'cap_over'         : '',          'ttl_security'     : '5', -        'local_as'         : '300', +        'system_as'        : '300',          'route_map_in'     : route_map_in,          'route_map_out'    : route_map_out,          'no_send_comm_ext' : '', @@ -87,7 +87,7 @@ neighbor_config = {          'shutdown'         : '',          'cap_over'         : '',          'ttl_security'     : '5', -        'local_as'         : '300', +        'system_as'        : '300',          'solo'             : '',          'route_map_in'     : route_map_in,          'route_map_out'    : route_map_out, @@ -131,7 +131,7 @@ peer_group_config = {          'remote_as'        : '200',          'shutdown'         : '',          'no_cap_nego'      : '', -        'local_as'         : '300', +        'system_as'        : '300',          'pfx_list_in'      : prefix_list_in,          'pfx_list_out'     : prefix_list_out,          'no_send_comm_ext' : '', @@ -177,7 +177,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          cls.cli_delete(cls, ['policy'])      def setUp(self): -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])      def tearDown(self):          self.cli_delete(['vrf']) @@ -266,12 +266,12 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          self.cli_set(base_path + ['parameters', 'router-id', router_id])          self.cli_set(base_path + ['parameters', 'log-neighbor-changes']) -        # Local AS number MUST be defined - as this is set in setUp() we remove +        # System AS number MUST be defined - as this is set in setUp() we remove          # this once for testing of the proper error -        self.cli_delete(base_path + ['local-as']) +        self.cli_delete(base_path + ['system-as'])          with self.assertRaises(ConfigSessionError):              self.cli_commit() -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])          # Default local preference (higher = more preferred, default value is 100)          self.cli_set(base_path + ['parameters', 'default', 'local-pref', local_pref]) @@ -760,13 +760,13 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          # templates and Jinja2 FRR template.          table = '1000' -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])          # testing only one AFI is sufficient as it's generic code          for vrf in vrfs:              vrf_base = ['vrf', 'name', vrf]              self.cli_set(vrf_base + ['table', table]) -            self.cli_set(vrf_base + ['protocols', 'bgp', 'local-as', ASN]) +            self.cli_set(vrf_base + ['protocols', 'bgp', 'system-as', ASN])              self.cli_set(vrf_base + ['protocols', 'bgp', 'parameters', 'router-id', router_id])              self.cli_set(vrf_base + ['protocols', 'bgp', 'route-map', route_map_in])              table = str(int(table) + 1000) @@ -804,7 +804,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          confed_id = str(int(ASN) + 1)          confed_asns = '10 20 30 40' -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])          self.cli_set(base_path + ['parameters', 'router-id', router_id])          self.cli_set(base_path + ['parameters', 'confederation', 'identifier', confed_id])          for asn in confed_asns.split(): @@ -825,7 +825,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          remote_asn = str(int(ASN) + 10)          interface = 'eth0' -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])          self.cli_set(base_path + ['neighbor', interface, 'address-family', 'ipv6-unicast'])          self.cli_set(base_path + ['neighbor', interface, 'interface', 'v6only', 'remote-as', remote_asn]) @@ -850,7 +850,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          rt_export = f'{neighbor}:1002 1.2.3.4:567'          rt_import = f'{neighbor}:1003 500:100' -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])          # testing only one AFI is sufficient as it's generic code          for afi in ['ipv4-unicast', 'ipv6-unicast']:              self.cli_set(base_path + ['address-family', afi, 'export', 'vpn']) @@ -889,7 +889,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):          peer_group = 'bar'          interface = 'eth0' -        self.cli_set(base_path + ['local-as', ASN]) +        self.cli_set(base_path + ['system-as', ASN])          self.cli_set(base_path + ['neighbor', neighbor, 'remote-as', remote_asn])          self.cli_set(base_path + ['neighbor', neighbor, 'peer-group', peer_group])          self.cli_set(base_path + ['peer-group', peer_group, 'remote-as', remote_asn]) diff --git a/src/conf_mode/protocols_bgp.py b/src/conf_mode/protocols_bgp.py index 7d3687094..0f8f1af42 100755 --- a/src/conf_mode/protocols_bgp.py +++ b/src/conf_mode/protocols_bgp.py @@ -121,8 +121,8 @@ def verify(bgp):                                        'dependent VRF instance(s) exist!')          return None -    if 'local_as' not in bgp: -        raise ConfigError('BGP local-as number must be defined!') +    if 'system_as' not in bgp: +        raise ConfigError('BGP system-as number must be defined!')      # Common verification for both peer-group and neighbor statements      for neighbor in ['neighbor', 'peer_group']: @@ -147,8 +147,8 @@ def verify(bgp):                  # Neighbor local-as override can not be the same as the local-as                  # we use for this BGP instane!                  asn = list(peer_config['local_as'].keys())[0] -                if asn == bgp['local_as']: -                    raise ConfigError('Cannot have local-as same as BGP AS number') +                if asn == bgp['system_as']: +                    raise ConfigError('Cannot have local-as same as system-as number')                  # Neighbor AS specified for local-as and remote-as can not be the same                  if dict_search('remote_as', peer_config) == asn: diff --git a/src/migration-scripts/bgp/2-to-3 b/src/migration-scripts/bgp/2-to-3 new file mode 100755 index 000000000..7ced0a3b0 --- /dev/null +++ b/src/migration-scripts/bgp/2-to-3 @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +# T4257: Discussion on changing BGP autonomous system number syntax + +from sys import argv +from sys import exit + +from vyos.configtree import ConfigTree + +if (len(argv) < 1): +    print("Must specify file name!") +    exit(1) + +file_name = argv[1] + +with open(file_name, 'r') as f: +    config_file = f.read() + +config = ConfigTree(config_file) + +# Check if BGP is even configured. Then check if local-as exists, then add the system-as, then remove the local-as. This is for global configuration. +if config.exists(['protocols', 'bgp']): +    if config.exists(['protocols', 'bgp', 'local-as']): +        config.rename(['protocols', 'bgp', 'local-as'], 'system-as') + +# Check if vrf names are configured. Then check if local-as exists inside of a name, then add the system-as, then remove the local-as. This is for vrf configuration. +if config.exists(['vrf', 'name']): +    for vrf in config.list_nodes(['vrf', 'name']): +        if config.exists(['vrf', f'name {vrf}', 'protocols', 'bgp', 'local-as']): +            config.rename(['vrf', f'name {vrf}', 'protocols', 'bgp', 'local-as'], 'system-as') + +try: +    with open(file_name, 'w') as f: +        f.write(config.to_string()) +except OSError as e: +    print(f'Failed to save the modified config: {e}') +    exit(1) | 
