summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2021-09-03 20:44:42 +0200
committerChristian Poessinger <christian@poessinger.com>2021-09-03 20:44:42 +0200
commit5f1c1ae4770fe36b5290f34d2f3a248c6b1a0ddb (patch)
treed468b57f4eb32ebdec321319b8a5e3dbed209146
parent6ad00236d7eae942c480825384fdd8a032944da8 (diff)
downloadvyos-1x-5f1c1ae4770fe36b5290f34d2f3a248c6b1a0ddb.tar.gz
vyos-1x-5f1c1ae4770fe36b5290f34d2f3a248c6b1a0ddb.zip
bgp: T3798: add support for neighbor local-as <n> replace-as
-rw-r--r--data/templates/frr/bgpd.frr.tmpl5
-rw-r--r--interface-definitions/include/bgp/neighbor-local-as.xml.i12
-rwxr-xr-xsmoketest/scripts/cli/test_protocols_bgp.py8
-rwxr-xr-xsrc/conf_mode/protocols_bgp.py2
4 files changed, 18 insertions, 9 deletions
diff --git a/data/templates/frr/bgpd.frr.tmpl b/data/templates/frr/bgpd.frr.tmpl
index 96815836b..4ac2127cb 100644
--- a/data/templates/frr/bgpd.frr.tmpl
+++ b/data/templates/frr/bgpd.frr.tmpl
@@ -46,8 +46,9 @@
neighbor {{ neighbor }} {{ graceful_restart }}
{% endif %}
{% if config.local_as is defined and config.local_as is not none %}
-{% for local_asn in config.local_as %}
- neighbor {{ neighbor }} local-as {{ local_asn }} {{ 'no-prepend' if config.local_as[local_asn].no_prepend is defined }}
+{% for local_asn, local_asn_config in config.local_as.items() %}
+{# There can be only one local-as value, this is checked in the Python code #}
+ neighbor {{ neighbor }} local-as {{ local_asn }} {{ 'no-prepend' if local_asn_config.no_prepend is defined }} {{ 'replace-as' if local_asn_config.replace_as is defined }}
{% endfor %}
{% endif %}
{% if config.override_capability is defined %}
diff --git a/interface-definitions/include/bgp/neighbor-local-as.xml.i b/interface-definitions/include/bgp/neighbor-local-as.xml.i
index 28c6b72b6..8cf0167fd 100644
--- a/interface-definitions/include/bgp/neighbor-local-as.xml.i
+++ b/interface-definitions/include/bgp/neighbor-local-as.xml.i
@@ -1,10 +1,10 @@
<!-- include start from bgp/neighbor-local-as.xml.i -->
<tagNode name="local-as">
<properties>
- <help>Local AS number [REQUIRED]</help>
+ <help>Specify alternate ASN for this BGP process</help>
<valueHelp>
<format>u32:1-4294967294</format>
- <description>Local AS number</description>
+ <description>Autonomous System Number (ASN)</description>
</valueHelp>
<constraint>
<validator name="numeric" argument="--range 1-4294967294"/>
@@ -13,7 +13,13 @@
<children>
<leafNode name="no-prepend">
<properties>
- <help>Disable prepending local-as to updates from EBGP peers</help>
+ <help>Disable prepending local-as from/to updates for eBGP peers</help>
+ <valueless/>
+ </properties>
+ </leafNode>
+ <leafNode name="replace-as">
+ <properties>
+ <help>Prepend only local-as from/to updates for eBGP peers</help>
<valueless/>
</properties>
</leafNode>
diff --git a/smoketest/scripts/cli/test_protocols_bgp.py b/smoketest/scripts/cli/test_protocols_bgp.py
index df9dc342b..05919abbc 100755
--- a/smoketest/scripts/cli/test_protocols_bgp.py
+++ b/smoketest/scripts/cli/test_protocols_bgp.py
@@ -165,7 +165,7 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):
if 'multi_hop' in peer_config:
self.assertIn(f' neighbor {peer} ebgp-multihop {peer_config["multi_hop"]}', frrconfig)
if 'local_as' in peer_config:
- self.assertIn(f' neighbor {peer} local-as {peer_config["local_as"]}', frrconfig)
+ self.assertIn(f' neighbor {peer} local-as {peer_config["local_as"]} no-prepend replace-as', frrconfig)
if 'cap_over' in peer_config:
self.assertIn(f' neighbor {peer} override-capability', frrconfig)
if 'passive' in peer_config:
@@ -284,7 +284,8 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):
if 'multi_hop' in peer_config:
self.cli_set(base_path + ['neighbor', peer, 'ebgp-multihop', peer_config["multi_hop"]])
if 'local_as' in peer_config:
- self.cli_set(base_path + ['neighbor', peer, 'local-as', peer_config["local_as"]])
+ self.cli_set(base_path + ['neighbor', peer, 'local-as', peer_config["local_as"], 'no-prepend'])
+ self.cli_set(base_path + ['neighbor', peer, 'local-as', peer_config["local_as"], 'replace-as'])
if 'cap_over' in peer_config:
self.cli_set(base_path + ['neighbor', peer, 'override-capability'])
if 'passive' in peer_config:
@@ -353,7 +354,8 @@ class TestProtocolsBGP(VyOSUnitTestSHIM.TestCase):
if 'multi_hop' in config:
self.cli_set(base_path + ['peer-group', peer_group, 'ebgp-multihop', config["multi_hop"]])
if 'local_as' in config:
- self.cli_set(base_path + ['peer-group', peer_group, 'local-as', config["local_as"]])
+ self.cli_set(base_path + ['peer-group', peer_group, 'local-as', config["local_as"], 'no-prepend'])
+ self.cli_set(base_path + ['peer-group', peer_group, 'local-as', config["local_as"], 'replace-as'])
if 'cap_over' in config:
self.cli_set(base_path + ['peer-group', peer_group, 'override-capability'])
if 'passive' in config:
diff --git a/src/conf_mode/protocols_bgp.py b/src/conf_mode/protocols_bgp.py
index 7d05eed9f..e24fcef14 100755
--- a/src/conf_mode/protocols_bgp.py
+++ b/src/conf_mode/protocols_bgp.py
@@ -130,7 +130,7 @@ def verify(bgp):
if 'local_as' in peer_config:
if len(peer_config['local_as']) > 1:
- raise ConfigError('Only one local-as number may be specified!')
+ raise ConfigError(f'Only one local-as number can be specified for peer "{peer}"!')
# Neighbor local-as override can not be the same as the local-as
# we use for this BGP instane!