summaryrefslogtreecommitdiff
path: root/src/conf_mode/protocols_bfd.py
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2021-02-15 20:16:02 +0100
committerChristian Poessinger <christian@poessinger.com>2021-02-15 20:16:02 +0100
commit3d3d09d6e5d7350b09709447ed4d7a7790e09b81 (patch)
treec08e2227b4ffebfa81f2070b46c4d241f52c64cb /src/conf_mode/protocols_bfd.py
parent3a32c507134c4599f343dda54ccf4e80ea62def4 (diff)
downloadvyos-1x-3d3d09d6e5d7350b09709447ed4d7a7790e09b81.tar.gz
vyos-1x-3d3d09d6e5d7350b09709447ed4d7a7790e09b81.zip
bfd: T3310: implement peer profile support
Diffstat (limited to 'src/conf_mode/protocols_bfd.py')
-rwxr-xr-xsrc/conf_mode/protocols_bfd.py71
1 files changed, 36 insertions, 35 deletions
diff --git a/src/conf_mode/protocols_bfd.py b/src/conf_mode/protocols_bfd.py
index 7737c6aa1..a43eed504 100755
--- a/src/conf_mode/protocols_bfd.py
+++ b/src/conf_mode/protocols_bfd.py
@@ -36,54 +36,55 @@ def get_config(config=None):
else:
conf = Config()
base = ['protocols', 'bfd']
- bfd = conf.get_config_dict(base, key_mangling=('-', '_'), get_first_key=True)
+ bfd = conf.get_config_dict(base, get_first_key=True)
# Bail out early if configuration tree does not exist
if not conf.exists(base):
return bfd
+ # We have gathered the dict representation of the CLI, but there are
+ # default options which we need to update into the dictionary retrived.
+ # XXX: T2665: we currently have no nice way for defaults under tag
+ # nodes, thus we load the defaults "by hand"
+ default_values = defaults(base + ['peer'])
if 'peer' in bfd:
- # We have gathered the dict representation of the CLI, but there are
- # default options which we need to update into the dictionary retrived.
- # XXX: T2665: we currently have no nice way for defaults under tag
- # nodes, thus we load the defaults "by hand"
- default_values = defaults(base + ['peer'])
for peer in bfd['peer']:
bfd['peer'][peer] = dict_merge(default_values, bfd['peer'][peer])
+ if 'profile' in bfd:
+ for profile in bfd['profile']:
+ bfd['profile'][profile] = dict_merge(default_values, bfd['profile'][profile])
+
return bfd
def verify(bfd):
- if not bfd or 'peer' not in bfd:
+ if not bfd:
return None
- for peer, peer_config in bfd['peer'].items():
- # IPv6 link local peers require an explicit local address/interface
- if is_ipv6_link_local(peer):
- if 'source' not in peer_config or len(peer_config['source'] < 2):
- raise ConfigError('BFD IPv6 link-local peers require explicit local address and interface setting')
-
- # IPv6 peers require an explicit local address
- if is_ipv6(peer):
- if 'source' not in peer_config or 'address' not in peer_config['source']:
- raise ConfigError('BFD IPv6 peers require explicit local address setting')
-
- if 'multihop' in peer_config:
- # multihop require source address
- if 'source' not in peer_config or 'address' not in peer_config['source']:
- raise ConfigError('BFD multihop require source address')
-
- # multihop and echo-mode cannot be used together
- if 'echo_mode' in peer_config:
- raise ConfigError('Multihop and echo-mode cannot be used together')
-
- # multihop doesn't accept interface names
- if 'source' in peer_config and 'interface' in peer_config['source']:
- raise ConfigError('Multihop and source interface cannot be used together')
-
- # echo interval can be configured only with enabled echo-mode
- if 'interval' in peer_config and 'echo_interval' in peer_config['interval'] and 'echo_mode' not in peer_config:
- raise ConfigError('echo-interval can be configured only with enabled echo-mode')
+ if 'peer' in bfd:
+ for peer, peer_config in bfd['peer'].items():
+ # IPv6 link local peers require an explicit local address/interface
+ if is_ipv6_link_local(peer):
+ if 'source' not in peer_config or len(peer_config['source'] < 2):
+ raise ConfigError('BFD IPv6 link-local peers require explicit local address and interface setting')
+
+ # IPv6 peers require an explicit local address
+ if is_ipv6(peer):
+ if 'source' not in peer_config or 'address' not in peer_config['source']:
+ raise ConfigError('BFD IPv6 peers require explicit local address setting')
+
+ if 'multihop' in peer_config:
+ # multihop require source address
+ if 'source' not in peer_config or 'address' not in peer_config['source']:
+ raise ConfigError('BFD multihop require source address')
+
+ # multihop and echo-mode cannot be used together
+ if 'echo_mode' in peer_config:
+ raise ConfigError('Multihop and echo-mode cannot be used together')
+
+ # multihop doesn't accept interface names
+ if 'source' in peer_config and 'interface' in peer_config['source']:
+ raise ConfigError('Multihop and source interface cannot be used together')
return None
@@ -98,7 +99,7 @@ def apply(bfd):
# Save original configuration prior to starting any commit actions
frr_cfg = frr.FRRConfig()
frr_cfg.load_configuration()
- frr_cfg.modify_section('bfd', '')
+ frr_cfg.modify_section('^bfd', '')
frr_cfg.add_before(r'(ip prefix-list .*|route-map .*|line vty)', bfd['new_frr_config'])
frr_cfg.commit_configuration()