From f340e65082802ebed3e6534a5f459cf245c9eea6 Mon Sep 17 00:00:00 2001 From: thatmattlove Date: Sun, 30 Jun 2024 23:33:06 -0400 Subject: [PATCH] fix BGP route validation --- hyperglass/api/fake_output.py | 14 ++++++-------- hyperglass/models/data/bgp_route.py | 10 +++++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/hyperglass/api/fake_output.py b/hyperglass/api/fake_output.py index 77d862e..8405a82 100644 --- a/hyperglass/api/fake_output.py +++ b/hyperglass/api/fake_output.py @@ -158,13 +158,6 @@ BGP_ROUTES = [ }, ] -STRUCTURED = BGPRouteTable( - vrf="default", - count=len(BGP_ROUTES), - routes=BGP_ROUTES, - winning_weight="high", -) - PING = r"""PING 1.1.1.1 (1.1.1.1): 56 data bytes 64 bytes from 1.1.1.1: icmp_seq=0 ttl=59 time=4.696 ms 64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=4.699 ms @@ -196,6 +189,11 @@ async def fake_output(query_type: str, structured: bool) -> t.Union[str, BGPRout return TRACEROUTE if "bgp" in query_type: if structured: - return STRUCTURED + return BGPRouteTable( + vrf="default", + count=len(BGP_ROUTES), + routes=BGP_ROUTES, + winning_weight="high", + ) return BGP_PLAIN return BGP_PLAIN diff --git a/hyperglass/models/data/bgp_route.py b/hyperglass/models/data/bgp_route.py index 2ccc588..dc417ed 100644 --- a/hyperglass/models/data/bgp_route.py +++ b/hyperglass/models/data/bgp_route.py @@ -6,7 +6,7 @@ import typing as t from ipaddress import ip_network # Third Party -from pydantic import field_validator +from pydantic import field_validator, ValidationInfo # Project from hyperglass.state import use_state @@ -70,7 +70,7 @@ class BGPRoute(HyperglassModel): return [c for c in value if func(c)] @field_validator("rpki_state") - def validate_rpki_state(cls, value, values): + def validate_rpki_state(cls, value, info: ValidationInfo): """If external RPKI validation is enabled, get validation state.""" (structured := use_state("params").structured) @@ -82,7 +82,7 @@ class BGPRoute(HyperglassModel): if structured.rpki.mode == "external": # If external validation is enabled, validate the prefix # & asn with Cloudflare's RPKI API. - as_path = values["as_path"] + as_path = info.data.get("as_path", []) if len(as_path) == 0: # If the AS_PATH length is 0, i.e. for an internal route, @@ -92,13 +92,13 @@ class BGPRoute(HyperglassModel): asn = as_path[-1] try: - net = ip_network(values["prefix"]) + net = ip_network(info.data["prefix"]) except ValueError: return 3 # Only do external RPKI lookups for global prefixes. if net.is_global: - return rpki_state(prefix=values["prefix"], asn=asn) + return rpki_state(prefix=info.data["prefix"], asn=asn) return value