tools: frr-reload fix bgp nbr delete

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>
This commit is contained in:
Chirag Shah 2022-04-08 12:59:53 -07:00
parent d2acc328bd
commit 411d1a2950

View File

@ -873,6 +873,34 @@ def bgp_delete_nbr_remote_as_line(lines_to_add):
lines_to_add.remove((ctx_keys, line)) 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. This method handles deletion of bgp peer group config.
The objective is to delete config lines related to peers 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) bgp_delete_nbr_remote_as_line(lines_to_add)
del_dict = dict() del_dict = dict()
del_nbr_dict = dict()
# Stores the lines to move to the end of the pending list. # Stores the lines to move to the end of the pending list.
lines_to_del_to_del = [] lines_to_del_to_del = []
# Stores the lines to move to end of the pending list. # 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: if re_nb_remoteas:
lines_to_del_to_app.append((ctx_keys, line)) 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': {'PG': [], 'PG1': []},
# 'router bgp 65001 vrf vrf1': {'PG': [], 'PG1': []}} # 'router bgp 65001 vrf vrf1': {'PG': [], 'PG1': []}}
if ctx_keys[0] not in del_dict: 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: if found_pg_del_cmd == False:
bgp_delete_inst_move_line(lines_to_del) 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) return (lines_to_add, lines_to_del)
for (ctx_keys, line) in lines_to_del_to_app: for (ctx_keys, line) in lines_to_del_to_app: