diff options
| author | Emanuele Di Pascale <emanuele@voltanet.io> | 2019-10-11 12:37:53 +0200 |
|---|---|---|
| committer | Emanuele Di Pascale <emanuele@voltanet.io> | 2019-10-29 10:32:38 +0100 |
| commit | ccef6e47a3eda4adb4fd521bc2c4c036b6119d0e (patch) | |
| tree | ef22dba59c8acc1e5cea32fa324d8d8f5c4b3dd9 /tools/frr-reload.py | |
| parent | d9730542a9b899222bf218be0df94122e7151b15 (diff) | |
tools, vtysh: fix ldpd + frr-reload.py
frr-reload.py has many special case rules that did not consider ldpd
at all. Specifically:
1. The bulk of ldp configuration comes in a big 'mpls ldp' context, which was
previously considered a single-line context as it started with 'mpls'. This
rule should only apply to labels and lsps.
2. ldp has a 'router-id' config line that fell into the same rule as the above
one. It should not be considered a single-line context as more ldp
configuration can follow.
3. enabled interfaces should not end their context. A better fix
would actually require popping a new context for each interface
in case there is any interface-specific config, but at least this
fix will address the most common use case.
4. when declaring pseudowires, any line with 'member pseudowire XXX' should
be considered a sub-context of the 'l2vpn YYY type ZZZ' context. Without
this fix, changes in the first psuedowire declared would not correctly
be processed (e.g. removing a 'control-word exclude' line would not
be picked up).
Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
Diffstat (limited to 'tools/frr-reload.py')
| -rwxr-xr-x | tools/frr-reload.py | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/tools/frr-reload.py b/tools/frr-reload.py index 8a437e8ba3..cf31da38b8 100755 --- a/tools/frr-reload.py +++ b/tools/frr-reload.py @@ -404,7 +404,8 @@ end "ip ", "ipv6 ", "log ", - "mpls", + "mpls lsp", + "mpls label", "no ", "password ", "ptm-enable", @@ -424,7 +425,12 @@ end continue # one line contexts - if new_ctx is True and any(line.startswith(keyword) for keyword in oneline_ctx_keywords): + # there is one exception though: ldpd accepts a 'router-id' clause + # as part of its 'mpls ldp' config context. If we are processing + # ldp configuration and encounter a router-id we should NOT switch + # to a new context + if new_ctx is True and any(line.startswith(keyword) for keyword in oneline_ctx_keywords) and not ( + ctx_keys and ctx_keys[0].startswith("mpls ldp") and line.startswith("router-id ")): self.save_contexts(ctx_keys, current_context_lines) # Start a new context @@ -489,7 +495,8 @@ end elif (line.startswith("address-family ") or line.startswith("vnc defaults") or line.startswith("vnc l2-group") or - line.startswith("vnc nve-group")): + line.startswith("vnc nve-group") or + line.startswith("member pseudowire")): main_ctx_key = [] # Save old context first @@ -498,9 +505,9 @@ end main_ctx_key = copy.deepcopy(ctx_keys) log.debug('LINE %-50s: entering sub-context, append to ctx_keys', line) - if line == "address-family ipv6": + if line == "address-family ipv6" and not ctx_keys[0].startswith("mpls ldp"): ctx_keys.append("address-family ipv6 unicast") - elif line == "address-family ipv4": + elif line == "address-family ipv4" and not ctx_keys[0].startswith("mpls ldp"): ctx_keys.append("address-family ipv4 unicast") elif line == "address-family evpn": ctx_keys.append("address-family l2vpn evpn") |
