feat: Add Infrahub Jinja2 transform for BGP configuration (#23) #27

Merged
Damien merged 2 commits from feat/infrahub-transforms-bgp into main 2026-03-01 13:22:52 +00:00

2 Commits

Author SHA1 Message Date
Damien
c3587a1c9c 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>
2026-03-01 13:05:37 +01:00
Damien
6df4e5ab19 feat: Add Infrahub Jinja2 transform for BGP configuration (#23)
Single unified bgp_yang_transform covering the full BGP router stanza
(process config, peer groups, neighbors, address families) for all
10 fabric devices in a single query+template pass.

- Add GraphQL query bgp_intent.gql: queries InfraBGPRouterConfig by
  device name, traversing local_asn, peer_groups (with remote_asn),
  and sessions (with peer_group, remote_asn, vrf, peer_device);
  separately queries InfraBGPAddressFamily for the same device,
  including active_peer_groups, active_sessions, networks, and optional
  vrf relationship
- Add Jinja2 template bgp_yang.j2: renders a JSON object with bgp.global
  (ASN, router-id, distances, ECMP), bgp.peer_groups, bgp.neighbors,
  bgp.address_families for global sessions, plus bgp.vrf_neighbors and
  bgp.vrf_address_families for VRF-scoped entries (e.g. leaf7 VRF gold
  border peering); returns [] for devices with no BGP config; all
  optional relationships guarded with 'is defined and is not none' checks;
  send_community "none" normalised to null in output
- Update .infrahub.yml: register bgp_intent query and bgp_yang_transform
- Add unit test fixtures for three representative devices:
    leaf1  — 3 peer-groups, 5 global neighbors, 2 global AFs
    spine1 — 1 peer-group (evpn/next-hop-unchanged), 16 neighbors
             (8 direct underlay with remote_asn, 8 EVPN via peer-group),
             IPv4 AF activates individual sessions
    leaf7  — leaf1 pattern + VRF gold border session (AS 64999) and
             VRF-scoped IPv4 unicast AF

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-01 12:41:08 +01:00