From c3587a1c9c909b4c8a9ef330cafa4aba6ca907db Mon Sep 17 00:00:00 2001 From: Damien Date: Sun, 1 Mar 2026 13:05:37 +0100 Subject: [PATCH] fix: Add direct device relationship to BGPAddressFamily for query filtering (#23) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InfraHub does not support multi-hop relationship traversal in GraphQL filters, so `bgp_config__device__name__value` fails at query time. Fix follows the same pattern used for InfraMlagPeerConfig (#22): add a denormalized direct device relationship to the schema node and use it in the query filter. Changes: - infrahub/schemas/bgp.yml: add `device` relationship (kind: Attribute, cardinality: one, optional: false) to BGPAddressFamily as the first relationship, before bgp_config - infrahub/objects/11-bgp-sessions.yml: add `device: [""]` to all 22 InfraBGPAddressFamily entries (spine1×2, spine2×2, leaf1–8×2 each, plus leaf7 and leaf8 VRF gold AF) - infrahub/transforms/queries/bgp_intent.gql: change filter from `bgp_config__device__name__value` to `device__name__value` Co-Authored-By: Claude Sonnet 4.6 --- infrahub/objects/11-bgp-sessions.yml | 22 ++++++++++++++++++++++ infrahub/schemas/bgp.yml | 6 ++++++ infrahub/transforms/queries/bgp_intent.gql | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/infrahub/objects/11-bgp-sessions.yml b/infrahub/objects/11-bgp-sessions.yml index 54d835f..458ae32 100644 --- a/infrahub/objects/11-bgp-sessions.yml +++ b/infrahub/objects/11-bgp-sessions.yml @@ -512,6 +512,7 @@ spec: # Spine1 address families # ============================================================ - bgp_config: ["spine1"] + device: ["spine1"] local_identifier: "spine1__ipv4_unicast" afi: ipv4 safi: unicast @@ -527,6 +528,7 @@ spec: networks: - ["10.0.250.1/32"] - bgp_config: ["spine1"] + device: ["spine1"] local_identifier: "spine1__evpn_unicast" afi: evpn safi: unicast @@ -536,6 +538,7 @@ spec: # Spine2 address families # ============================================================ - bgp_config: ["spine2"] + device: ["spine2"] local_identifier: "spine2__ipv4_unicast" afi: ipv4 safi: unicast @@ -551,6 +554,7 @@ spec: networks: - ["10.0.250.2/32"] - bgp_config: ["spine2"] + device: ["spine2"] local_identifier: "spine2__evpn_unicast" afi: evpn safi: unicast @@ -560,6 +564,7 @@ spec: # Leaf1 address families # ============================================================ - bgp_config: ["leaf1"] + device: ["leaf1"] local_identifier: "leaf1__ipv4_unicast" afi: ipv4 safi: unicast @@ -570,6 +575,7 @@ spec: - ["10.0.250.11/32"] - ["10.0.255.11/32"] - bgp_config: ["leaf1"] + device: ["leaf1"] local_identifier: "leaf1__evpn_unicast" afi: evpn safi: unicast @@ -579,6 +585,7 @@ spec: # Leaf2 address families # ============================================================ - bgp_config: ["leaf2"] + device: ["leaf2"] local_identifier: "leaf2__ipv4_unicast" afi: ipv4 safi: unicast @@ -589,6 +596,7 @@ spec: - ["10.0.250.12/32"] - ["10.0.255.11/32"] - bgp_config: ["leaf2"] + device: ["leaf2"] local_identifier: "leaf2__evpn_unicast" afi: evpn safi: unicast @@ -598,6 +606,7 @@ spec: # Leaf3 address families # ============================================================ - bgp_config: ["leaf3"] + device: ["leaf3"] local_identifier: "leaf3__ipv4_unicast" afi: ipv4 safi: unicast @@ -608,6 +617,7 @@ spec: - ["10.0.250.13/32"] - ["10.0.255.12/32"] - bgp_config: ["leaf3"] + device: ["leaf3"] local_identifier: "leaf3__evpn_unicast" afi: evpn safi: unicast @@ -617,6 +627,7 @@ spec: # Leaf4 address families # ============================================================ - bgp_config: ["leaf4"] + device: ["leaf4"] local_identifier: "leaf4__ipv4_unicast" afi: ipv4 safi: unicast @@ -627,6 +638,7 @@ spec: - ["10.0.250.14/32"] - ["10.0.255.12/32"] - bgp_config: ["leaf4"] + device: ["leaf4"] local_identifier: "leaf4__evpn_unicast" afi: evpn safi: unicast @@ -636,6 +648,7 @@ spec: # Leaf5 address families # ============================================================ - bgp_config: ["leaf5"] + device: ["leaf5"] local_identifier: "leaf5__ipv4_unicast" afi: ipv4 safi: unicast @@ -646,6 +659,7 @@ spec: - ["10.0.250.15/32"] - ["10.0.255.13/32"] - bgp_config: ["leaf5"] + device: ["leaf5"] local_identifier: "leaf5__evpn_unicast" afi: evpn safi: unicast @@ -655,6 +669,7 @@ spec: # Leaf6 address families # ============================================================ - bgp_config: ["leaf6"] + device: ["leaf6"] local_identifier: "leaf6__ipv4_unicast" afi: ipv4 safi: unicast @@ -665,6 +680,7 @@ spec: - ["10.0.250.16/32"] - ["10.0.255.13/32"] - bgp_config: ["leaf6"] + device: ["leaf6"] local_identifier: "leaf6__evpn_unicast" afi: evpn safi: unicast @@ -674,6 +690,7 @@ spec: # Leaf7 address families # ============================================================ - bgp_config: ["leaf7"] + device: ["leaf7"] local_identifier: "leaf7__ipv4_unicast" afi: ipv4 safi: unicast @@ -684,6 +701,7 @@ spec: - ["10.0.250.17/32"] - ["10.0.255.14/32"] - bgp_config: ["leaf7"] + device: ["leaf7"] local_identifier: "leaf7__evpn_unicast" afi: evpn safi: unicast @@ -691,6 +709,7 @@ spec: - ["leaf7__evpn"] # Leaf7 IPv4 unicast in VRF gold (border peering) - bgp_config: ["leaf7"] + device: ["leaf7"] local_identifier: "leaf7__vrf_gold__ipv4_unicast" afi: ipv4 safi: unicast @@ -701,6 +720,7 @@ spec: # Leaf8 address families # ============================================================ - bgp_config: ["leaf8"] + device: ["leaf8"] local_identifier: "leaf8__ipv4_unicast" afi: ipv4 safi: unicast @@ -711,6 +731,7 @@ spec: - ["10.0.250.18/32"] - ["10.0.255.14/32"] - bgp_config: ["leaf8"] + device: ["leaf8"] local_identifier: "leaf8__evpn_unicast" afi: evpn safi: unicast @@ -718,6 +739,7 @@ spec: - ["leaf8__evpn"] # Leaf8 IPv4 unicast in VRF gold (border peering) - bgp_config: ["leaf8"] + device: ["leaf8"] local_identifier: "leaf8__vrf_gold__ipv4_unicast" afi: ipv4 safi: unicast diff --git a/infrahub/schemas/bgp.yml b/infrahub/schemas/bgp.yml index c246ebf..a8653d2 100644 --- a/infrahub/schemas/bgp.yml +++ b/infrahub/schemas/bgp.yml @@ -264,6 +264,12 @@ nodes: label: Multicast description: Sub Address Family Identifier relationships: + - name: device + peer: InfraDevice + cardinality: one + kind: Attribute + optional: false + description: Device this address family belongs to (denormalized for query filtering) - name: bgp_config peer: InfraBGPRouterConfig cardinality: one diff --git a/infrahub/transforms/queries/bgp_intent.gql b/infrahub/transforms/queries/bgp_intent.gql index 8274652..7650840 100644 --- a/infrahub/transforms/queries/bgp_intent.gql +++ b/infrahub/transforms/queries/bgp_intent.gql @@ -68,7 +68,7 @@ query BgpIntent($device_name: String!) { } } } - InfraBGPAddressFamily(bgp_config__device__name__value: $device_name) { + InfraBGPAddressFamily(device__name__value: $device_name) { edges { node { afi { value }