]> git.puffer.fish Git - matthieu/frr.git/commitdiff
tools: frr-reload fix bgp nbr delete
authorChirag Shah <chirag@nvidia.com>
Fri, 8 Apr 2022 19:59:53 +0000 (12:59 -0700)
committerChirag Shah <chirag@nvidia.com>
Sat, 23 Apr 2022 19:49:47 +0000 (12:49 -0700)
When a bgp neighbor removed from associated to peer-group,
the neighbor is fully deleted, subsequent deletion of any
configuration related to the neighbor leads to failure
in frr-reload.

Fix: In frr-reload lines to delete check if any neighbor with
peer-group removal line is present, if so then remove any
further config deletion associated the neighbor needs to removed
from the lines to delete.

Ticket:#3032234
Reviewed By:
Testing Done:

BEFORE FIX:
-----------
2022-04-08 20:03:32,734  INFO: Executed "router bgp 4200000005  no neighbor swp5 interface peer-group UNDERLAY"
2022-04-08 20:03:32,892  INFO: Failed to execute router bgp 4200000005  no neighbor swp5 password SSSS
2022-04-08 20:03:33,050  INFO: Failed to execute router bgp 4200000005  no neighbor swp5 password
2022-04-08 20:03:33,218  INFO: Failed to execute router bgp 4200000005  no neighbor swp5
2022-04-08 20:03:33,354  INFO: Failed to execute router bgp 4200000005  no neighbor
2022-04-08 20:03:33,520  INFO: Failed to execute router bgp 4200000005  no
2022-04-08 20:03:33,521 ERROR: "router bgp 4200000005 --  no" we failed to remove this command
2022-04-08 20:03:33,521 ERROR: % Specify remote-as or peer-group commands first

2022-04-08 20:03:33,691  INFO: Failed to execute router bgp 4200000005  no neighbor swp5 advertisement-interval 0
2022-04-08 20:03:33,853  INFO: Failed to execute router bgp 4200000005  no neighbor swp5 advertisement-interval
2022-04-08 20:03:34,015  INFO: Failed to execute router bgp 4200000005  no neighbor swp5
2022-04-08 20:03:34,145  INFO: Failed to execute router bgp 4200000005  no neighbor
2022-04-08 20:03:34,326  INFO: Failed to execute router bgp 4200000005  no
2022-04-08 20:03:34,327 ERROR: "router bgp 4200000005 --  no" we failed to remove this command
2022-04-08 20:03:34,327 ERROR: % Specify remote-as or peer-group commands first

AFTER FIX:
----------

delete of numbered neighbor:

2022-04-08 19:52:17,204  INFO: Executed "router bgp 4200000005  no
neighbor 1.2.3.4 peer-group UNDERLAY"
2022-04-08 19:52:17,205  INFO: /var/run/frr/reload-GRFX1M.txt content

delete of unnumbered neighbor:
2022-04-08 20:00:02,952  INFO: Executed "router bgp 4200000005  no
neighbor swp5 interface peer-group UNDERLAY"
2022-04-08 20:00:02,953  INFO: /var/run/frr/reload-722C3P.txt content

Signed-off-by: Chirag Shah <chirag@nvidia.com>
tools/frr-reload.py

index 8749215b1ed8c137665817e2f19ba320e6fe8379..9b96243d98f2a68ddc1b0cf5cefc703330182a93 100755 (executable)
@@ -873,6 +873,34 @@ def bgp_delete_nbr_remote_as_line(lines_to_add):
         lines_to_add.remove((ctx_keys, line))
 
 
+def bgp_remove_neighbor_cfg(lines_to_del, del_nbr_dict):
+
+    # This method handles deletion of bgp neighbor configs,
+    # if there is neighbor to peer-group cmd is in delete list.
+    # As 'no neighbor .* peer-group' deletes the neighbor,
+    # subsequent neighbor speciic config line deletion results
+    # in error.
+    lines_to_del_to_del = []
+
+    for (ctx_keys, line) in lines_to_del:
+        if (
+            ctx_keys[0].startswith("router bgp")
+            and line
+            and line.startswith("neighbor ")
+        ):
+            if ctx_keys[0] in del_nbr_dict:
+                for nbr in del_nbr_dict[ctx_keys[0]]:
+                    re_nbr_pg = re.search('neighbor (\S+) .*peer-group (\S+)', line)
+                    nb_exp = "neighbor %s .*" % nbr
+                    if not re_nbr_pg:
+                        re_nb = re.search(nb_exp, line)
+                        if re_nb:
+                            lines_to_del_to_del.append((ctx_keys, line))
+
+    for (ctx_keys, line) in lines_to_del_to_del:
+        lines_to_del.remove((ctx_keys, line))
+
+
 """
 This method handles deletion of bgp peer group config.
 The objective is to delete config lines related to peers
@@ -886,6 +914,7 @@ def delete_move_lines(lines_to_add, lines_to_del):
     bgp_delete_nbr_remote_as_line(lines_to_add)
 
     del_dict = dict()
+    del_nbr_dict = dict()
     # Stores the lines to move to the end of the pending list.
     lines_to_del_to_del = []
     # Stores the lines to move to end of the pending list.
@@ -969,6 +998,16 @@ def delete_move_lines(lines_to_add, lines_to_del):
             if re_nb_remoteas:
                 lines_to_del_to_app.append((ctx_keys, line))
 
+            # 'no neighbor peer [interface] peer-group <>' is in lines_to_del
+            # copy the neighbor and look for all config removal lines associated
+            # to neighbor and delete them from the lines_to_del
+            re_nbr_pg = re.search('neighbor (\S+) .*peer-group (\S+)', line)
+            if re_nbr_pg:
+                if ctx_keys[0] not in del_nbr_dict:
+                    del_nbr_dict[ctx_keys[0]] = list()
+                if re_nbr_pg.group(1) not in del_nbr_dict[ctx_keys[0]]:
+                    del_nbr_dict[ctx_keys[0]].append(re_nbr_pg.group(1))
+
             # {'router bgp 65001': {'PG': [], 'PG1': []},
             # 'router bgp 65001 vrf vrf1': {'PG': [], 'PG1': []}}
             if ctx_keys[0] not in del_dict:
@@ -981,6 +1020,8 @@ def delete_move_lines(lines_to_add, lines_to_del):
 
     if found_pg_del_cmd == False:
         bgp_delete_inst_move_line(lines_to_del)
+        if del_nbr_dict:
+            bgp_remove_neighbor_cfg(lines_to_del, del_nbr_dict)
         return (lines_to_add, lines_to_del)
 
     for (ctx_keys, line) in lines_to_del_to_app: