diff --git a/hyperglass/models/parsing/frr.py b/hyperglass/models/parsing/frr.py index dacd82ce..27a3d89b 100644 --- a/hyperglass/models/parsing/frr.py +++ b/hyperglass/models/parsing/frr.py @@ -31,9 +31,9 @@ class FRRNextHop(_FRRBase): ip: str afi: str - metric: int + metric: int = 0 accessible: bool - used: bool + used: bool = False class FRRPeer(_FRRBase): @@ -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"] diff --git a/hyperglass/plugins/_builtin/bgp_route_frr.py b/hyperglass/plugins/_builtin/bgp_route_frr.py index 7130b205..96d25617 100644 --- a/hyperglass/plugins/_builtin/bgp_route_frr.py +++ b/hyperglass/plugins/_builtin/bgp_route_frr.py @@ -36,6 +36,10 @@ def parse_frr(output: t.Sequence[str]) -> "OutputDataModel": _log.debug("Pre-parsed data", data=parsed) + # If empty (i.e. no route found), skip + if not parsed: + continue + validated = FRRBGPTable(**parsed) bgp_table = validated.bgp_table()