Skip to content

Commit 9f669da

Browse files
authored
Add FRR failed route check in route_check.py (#284)
Cherry-pick from sonic-net/sonic-utilities PR #4119 with conflict resolution. Add detection for routes with failed state in FRR, covering both rejected and queued routes. Previously only offload flag was checked which could not detect rejected routes (offload is True for rejected routes). Changes: - Add failed_rt list to track routes with failed state - Return both missed_rt and failed_rt from check_frr_pending_routes() - Report failed FRR routes in results and syslog - Add test cases 35-38 for failed route detection
1 parent 82ee5d6 commit 9f669da

2 files changed

Lines changed: 370 additions & 5 deletions

File tree

scripts/route_check.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -599,12 +599,14 @@ def check_frr_pending_routes(namespace):
599599
"""
600600

601601
missed_rt = []
602+
failed_rt = []
602603
retries = FRR_CHECK_RETRIES
603604
for i in range(retries):
604605
missed_rt = []
606+
failed_rt = []
605607
frr_routes = get_frr_routes(namespace)
606608

607-
for _, entries in frr_routes.items():
609+
for route_prefix, entries in frr_routes.items():
608610
for entry in entries:
609611
if entry['protocol'] in ('connected', 'kernel', 'static'):
610612
continue
@@ -621,12 +623,16 @@ def check_frr_pending_routes(namespace):
621623
if not entry.get('offloaded', False):
622624
missed_rt.append(entry)
623625

624-
if not missed_rt:
626+
if entry.get('failed', False):
627+
failed_rt.append(route_prefix)
628+
629+
if not missed_rt and not failed_rt:
625630
break
626631

627632
time.sleep(FRR_WAIT_TIME)
628-
print_message(syslog.LOG_DEBUG, "FRR missed routes: {}".format(missed_rt, indent=4))
629-
return missed_rt
633+
print_message(syslog.LOG_DEBUG, "FRR missed routes: {}".format(json.dumps(missed_rt, indent=4)))
634+
print_message(syslog.LOG_DEBUG, "FRR failed routes: {}".format(json.dumps(failed_rt, indent=4)))
635+
return missed_rt, failed_rt
630636

631637

632638
def mitigate_installed_not_offloaded_frr_routes(namespace, missed_frr_rt, rt_appl):
@@ -769,6 +775,7 @@ def check_routes(namespace):
769775
rt_appl_miss = []
770776
rt_asic_miss = []
771777
rt_frr_miss = []
778+
rt_frr_failed = []
772779
adds[namespace] = []
773780
deletes[namespace] = []
774781

@@ -826,19 +833,27 @@ def check_routes(namespace):
826833
results[namespace] = {}
827834
results[namespace]["Unaccounted_ROUTE_ENTRY_TABLE_entries"] = rt_asic_miss
828835

829-
rt_frr_miss = check_frr_pending_routes(namespace)
836+
rt_frr_miss, rt_frr_failed = check_frr_pending_routes(namespace)
830837

831838
if rt_frr_miss:
832839
if namespace not in results:
833840
results[namespace] = {}
834841
results[namespace]["missed_FRR_routes"] = rt_frr_miss
835842

843+
if rt_frr_failed:
844+
if namespace not in results:
845+
results[namespace] = {}
846+
results[namespace]["failed_FRR_routes"] = rt_frr_failed
847+
836848
if results:
837849
if rt_frr_miss and not rt_appl_miss and not rt_asic_miss:
838850
print_message(syslog.LOG_ERR, "Some routes are not set offloaded in FRR{} \
839851
but all routes in APPL_DB and ASIC_DB are in sync".format(namespace))
840852
if is_suppress_fib_pending_enabled(namespace):
841853
mitigate_installed_not_offloaded_frr_routes(namespace, rt_frr_miss, rt_appl)
854+
if rt_frr_failed:
855+
print_message(syslog.LOG_ERR, "Some routes have failed state in FRR {} \
856+
: {}".format(namespace, rt_frr_failed))
842857

843858
if results:
844859
print_message(syslog.LOG_WARNING, "Failure results: {", json.dumps(results, indent=4), "}")

0 commit comments

Comments
 (0)