]> git.puffer.fish Git - mirror/frr.git/commitdiff
tools: fix bgp instances deletion in frr-reload
authorChirag Shah <chirag@nvidia.com>
Sat, 4 Dec 2021 21:27:29 +0000 (13:27 -0800)
committerChirag Shah <chirag@nvidia.com>
Sat, 23 Apr 2022 19:49:47 +0000 (12:49 -0700)
BGPd does not allow default instance deletion
in presence of bgp vrf instance;
frr-reload script fails if delete list contains
default instance followed by vrf instance.

Fix:
frr-reload scans lines_to_delete to look for
'router bgp' and 'router bgp vrf ...' line.
If both are present switch the order to delete
bgp vrf instance(s) than default instance at the end.

Testing Done:

Before:

  INFO: Loading Config object from file /etc/frr/frr.conf
  INFO: Loading Config object from vtysh show running
  INFO: Failed to execute no router bgp 40201 <-- Failed to delete
  INFO: Failed to execute no router bgp
  INFO: Failed to execute no router
 ERROR: "no router" we failed to remove this command
 ERROR: % Cannot delete default BGP instance. Dependent VRF instances exist

  INFO: Executed "no router bgp 40201 vrf bgp-test" <-- vrf instance deleted
  INFO: Loading Config object from vtysh show running

After:
  order of deletion switched

  INFO: Loading Config object from file /etc/frr/frr.conf
  INFO: Loading Config object from vtysh show running
  INFO: Executed "no router bgp 40201 vrf bgp-test"
  INFO: Executed "no router bgp 40201"
  INFO: Loading Config object from vtysh show running

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

index 4f30f7fbd830f48e4f8f97e2eab6c5338563aba5..8749215b1ed8c137665817e2f19ba320e6fe8379 100755 (executable)
@@ -763,6 +763,38 @@ def check_for_exit_vrf(lines_to_add, lines_to_del):
     return (lines_to_add, lines_to_del)
 
 
+def bgp_delete_inst_move_line(lines_to_del):
+    # Deletion of bgp default inst followed by
+    # bgp vrf inst leads to issue of default
+    # instance can not be removed.
+    # Move the bgp default instance line to end.
+    bgp_defult_inst = False
+    bgp_vrf_inst = False
+
+    for (ctx_keys, line) in lines_to_del:
+        # Find bgp default inst
+        if (
+            ctx_keys[0].startswith("router bgp")
+            and not line
+            and "vrf" not in ctx_keys[0]
+        ):
+            bgp_defult_inst = True
+        # Find bgp vrf inst
+        if ctx_keys[0].startswith("router bgp") and not line and "vrf" in ctx_keys[0]:
+            bgp_vrf_inst = True
+
+    if bgp_defult_inst and bgp_vrf_inst:
+        for (ctx_keys, line) in lines_to_del:
+            # move bgp default inst to end
+            if (
+                ctx_keys[0].startswith("router bgp")
+                and not line
+                and "vrf" not in ctx_keys[0]
+            ):
+                lines_to_del.remove((ctx_keys, line))
+                lines_to_del.append((ctx_keys, line))
+
+
 def bgp_delete_nbr_remote_as_line(lines_to_add):
     # Handle deletion of neighbor <nbr> remote-as line from
     # lines_to_add if the nbr is configured with peer-group and
@@ -948,6 +980,7 @@ def delete_move_lines(lines_to_add, lines_to_del):
                 found_pg_del_cmd = True
 
     if found_pg_del_cmd == False:
+        bgp_delete_inst_move_line(lines_to_del)
         return (lines_to_add, lines_to_del)
 
     for (ctx_keys, line) in lines_to_del_to_app:
@@ -1001,6 +1034,8 @@ def delete_move_lines(lines_to_add, lines_to_del):
         lines_to_del.remove((ctx_keys, line))
         lines_to_del.append((ctx_keys, line))
 
+    bgp_delete_inst_move_line(lines_to_del)
+
     return (lines_to_add, lines_to_del)