From 79d235c2ffceea5fc11f3cfd1cb95b4473b3e10f Mon Sep 17 00:00:00 2001 From: Tan Siewert Date: Sat, 4 Oct 2025 21:10:48 +0200 Subject: [PATCH] frr: return AS0 if AS_PATH length is zero Local prefixes usually do not have an AS_PATH: ``` vtysh -c "show bgp ipv4 unicast 10.10.10.10 json" | jq '.paths[].aspath' { "string": "Local", "segments": [], "length": 0 } ``` Set AS0 as a temporary solution when AS_PATH length is zero. This avoids parser failures for local prefixes, though ideally we should use the device's actual ASN (see TODO in code). Signed-off-by: Tan Siewert --- hyperglass/models/parsing/frr.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/hyperglass/models/parsing/frr.py b/hyperglass/models/parsing/frr.py index 95536e2..27a3d89 100644 --- a/hyperglass/models/parsing/frr.py +++ b/hyperglass/models/parsing/frr.py @@ -65,7 +65,15 @@ class FRRPath(_FRRBase): def validate_path(cls, values): """Extract meaningful data from FRR response.""" new = values.copy() - new["aspath"] = values["aspath"]["segments"][0]["list"] + # Local prefixes (i.e. those in the same ASN) usually have + # no AS_PATH. + # Set AS_PATH to AS0 for now as we cannot ensure that the + # ASN for the prefix is the primary ASN. + if values["aspath"]["length"] != 0: + new["aspath"] = values["aspath"]["segments"][0]["list"] + else: + # TODO: Get an ASN that is reasonable (e.g. primary ASN) + new["aspath"] = [0] community = values.get("community", {"list": []}) new["community"] = community["list"] new["lastUpdate"] = values["lastUpdate"]["epoch"]