fix: Add direct device relationship to BGPAddressFamily for query filtering (#23)

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: ["<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 <noreply@anthropic.com>
This commit is contained in:
Damien
2026-03-01 13:05:37 +01:00
parent 6df4e5ab19
commit c3587a1c9c
3 changed files with 29 additions and 1 deletions

View File

@@ -512,6 +512,7 @@ spec:
# Spine1 address families # Spine1 address families
# ============================================================ # ============================================================
- bgp_config: ["spine1"] - bgp_config: ["spine1"]
device: ["spine1"]
local_identifier: "spine1__ipv4_unicast" local_identifier: "spine1__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -527,6 +528,7 @@ spec:
networks: networks:
- ["10.0.250.1/32"] - ["10.0.250.1/32"]
- bgp_config: ["spine1"] - bgp_config: ["spine1"]
device: ["spine1"]
local_identifier: "spine1__evpn_unicast" local_identifier: "spine1__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -536,6 +538,7 @@ spec:
# Spine2 address families # Spine2 address families
# ============================================================ # ============================================================
- bgp_config: ["spine2"] - bgp_config: ["spine2"]
device: ["spine2"]
local_identifier: "spine2__ipv4_unicast" local_identifier: "spine2__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -551,6 +554,7 @@ spec:
networks: networks:
- ["10.0.250.2/32"] - ["10.0.250.2/32"]
- bgp_config: ["spine2"] - bgp_config: ["spine2"]
device: ["spine2"]
local_identifier: "spine2__evpn_unicast" local_identifier: "spine2__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -560,6 +564,7 @@ spec:
# Leaf1 address families # Leaf1 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf1"] - bgp_config: ["leaf1"]
device: ["leaf1"]
local_identifier: "leaf1__ipv4_unicast" local_identifier: "leaf1__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -570,6 +575,7 @@ spec:
- ["10.0.250.11/32"] - ["10.0.250.11/32"]
- ["10.0.255.11/32"] - ["10.0.255.11/32"]
- bgp_config: ["leaf1"] - bgp_config: ["leaf1"]
device: ["leaf1"]
local_identifier: "leaf1__evpn_unicast" local_identifier: "leaf1__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -579,6 +585,7 @@ spec:
# Leaf2 address families # Leaf2 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf2"] - bgp_config: ["leaf2"]
device: ["leaf2"]
local_identifier: "leaf2__ipv4_unicast" local_identifier: "leaf2__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -589,6 +596,7 @@ spec:
- ["10.0.250.12/32"] - ["10.0.250.12/32"]
- ["10.0.255.11/32"] - ["10.0.255.11/32"]
- bgp_config: ["leaf2"] - bgp_config: ["leaf2"]
device: ["leaf2"]
local_identifier: "leaf2__evpn_unicast" local_identifier: "leaf2__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -598,6 +606,7 @@ spec:
# Leaf3 address families # Leaf3 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf3"] - bgp_config: ["leaf3"]
device: ["leaf3"]
local_identifier: "leaf3__ipv4_unicast" local_identifier: "leaf3__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -608,6 +617,7 @@ spec:
- ["10.0.250.13/32"] - ["10.0.250.13/32"]
- ["10.0.255.12/32"] - ["10.0.255.12/32"]
- bgp_config: ["leaf3"] - bgp_config: ["leaf3"]
device: ["leaf3"]
local_identifier: "leaf3__evpn_unicast" local_identifier: "leaf3__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -617,6 +627,7 @@ spec:
# Leaf4 address families # Leaf4 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf4"] - bgp_config: ["leaf4"]
device: ["leaf4"]
local_identifier: "leaf4__ipv4_unicast" local_identifier: "leaf4__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -627,6 +638,7 @@ spec:
- ["10.0.250.14/32"] - ["10.0.250.14/32"]
- ["10.0.255.12/32"] - ["10.0.255.12/32"]
- bgp_config: ["leaf4"] - bgp_config: ["leaf4"]
device: ["leaf4"]
local_identifier: "leaf4__evpn_unicast" local_identifier: "leaf4__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -636,6 +648,7 @@ spec:
# Leaf5 address families # Leaf5 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf5"] - bgp_config: ["leaf5"]
device: ["leaf5"]
local_identifier: "leaf5__ipv4_unicast" local_identifier: "leaf5__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -646,6 +659,7 @@ spec:
- ["10.0.250.15/32"] - ["10.0.250.15/32"]
- ["10.0.255.13/32"] - ["10.0.255.13/32"]
- bgp_config: ["leaf5"] - bgp_config: ["leaf5"]
device: ["leaf5"]
local_identifier: "leaf5__evpn_unicast" local_identifier: "leaf5__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -655,6 +669,7 @@ spec:
# Leaf6 address families # Leaf6 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf6"] - bgp_config: ["leaf6"]
device: ["leaf6"]
local_identifier: "leaf6__ipv4_unicast" local_identifier: "leaf6__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -665,6 +680,7 @@ spec:
- ["10.0.250.16/32"] - ["10.0.250.16/32"]
- ["10.0.255.13/32"] - ["10.0.255.13/32"]
- bgp_config: ["leaf6"] - bgp_config: ["leaf6"]
device: ["leaf6"]
local_identifier: "leaf6__evpn_unicast" local_identifier: "leaf6__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -674,6 +690,7 @@ spec:
# Leaf7 address families # Leaf7 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf7"] - bgp_config: ["leaf7"]
device: ["leaf7"]
local_identifier: "leaf7__ipv4_unicast" local_identifier: "leaf7__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -684,6 +701,7 @@ spec:
- ["10.0.250.17/32"] - ["10.0.250.17/32"]
- ["10.0.255.14/32"] - ["10.0.255.14/32"]
- bgp_config: ["leaf7"] - bgp_config: ["leaf7"]
device: ["leaf7"]
local_identifier: "leaf7__evpn_unicast" local_identifier: "leaf7__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -691,6 +709,7 @@ spec:
- ["leaf7__evpn"] - ["leaf7__evpn"]
# Leaf7 IPv4 unicast in VRF gold (border peering) # Leaf7 IPv4 unicast in VRF gold (border peering)
- bgp_config: ["leaf7"] - bgp_config: ["leaf7"]
device: ["leaf7"]
local_identifier: "leaf7__vrf_gold__ipv4_unicast" local_identifier: "leaf7__vrf_gold__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -701,6 +720,7 @@ spec:
# Leaf8 address families # Leaf8 address families
# ============================================================ # ============================================================
- bgp_config: ["leaf8"] - bgp_config: ["leaf8"]
device: ["leaf8"]
local_identifier: "leaf8__ipv4_unicast" local_identifier: "leaf8__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast
@@ -711,6 +731,7 @@ spec:
- ["10.0.250.18/32"] - ["10.0.250.18/32"]
- ["10.0.255.14/32"] - ["10.0.255.14/32"]
- bgp_config: ["leaf8"] - bgp_config: ["leaf8"]
device: ["leaf8"]
local_identifier: "leaf8__evpn_unicast" local_identifier: "leaf8__evpn_unicast"
afi: evpn afi: evpn
safi: unicast safi: unicast
@@ -718,6 +739,7 @@ spec:
- ["leaf8__evpn"] - ["leaf8__evpn"]
# Leaf8 IPv4 unicast in VRF gold (border peering) # Leaf8 IPv4 unicast in VRF gold (border peering)
- bgp_config: ["leaf8"] - bgp_config: ["leaf8"]
device: ["leaf8"]
local_identifier: "leaf8__vrf_gold__ipv4_unicast" local_identifier: "leaf8__vrf_gold__ipv4_unicast"
afi: ipv4 afi: ipv4
safi: unicast safi: unicast

View File

@@ -264,6 +264,12 @@ nodes:
label: Multicast label: Multicast
description: Sub Address Family Identifier description: Sub Address Family Identifier
relationships: 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 - name: bgp_config
peer: InfraBGPRouterConfig peer: InfraBGPRouterConfig
cardinality: one cardinality: one

View File

@@ -68,7 +68,7 @@ query BgpIntent($device_name: String!) {
} }
} }
} }
InfraBGPAddressFamily(bgp_config__device__name__value: $device_name) { InfraBGPAddressFamily(device__name__value: $device_name) {
edges { edges {
node { node {
afi { value } afi { value }