Files
arista-evpn-vxlan-clab/.infrahub.yml
Damien Arnodo 1b918a4cbc feat: Add Infrahub Jinja2 transform for BGP configuration (#23) (#27)
## Summary

Closes #23. Implements a single unified `bgp_yang_transform` covering the complete BGP router stanza for all 10 fabric devices.

**Design decision:** One transform (one query + one template) rather than 4 separate transforms, because all BGP components (process config, peer groups, neighbors, AFs) live under a single `router bgp <ASN>` stanza and must be consistent. This avoids multiple API calls per device and keeps the data model coherent.

| File | Description |
|------|-------------|
| `infrahub/transforms/queries/bgp_intent.gql` | Unified GraphQL query — `InfraBGPRouterConfig` (with peer_groups, sessions) + `InfraBGPAddressFamily` (with active_peer_groups, active_sessions, networks, optional vrf) |
| `infrahub/transforms/templates/bgp_yang.j2` | Jinja2 template — renders `bgp.global`, `bgp.peer_groups`, `bgp.neighbors`, `bgp.address_families`, `bgp.vrf_neighbors`, `bgp.vrf_address_families`; returns `[]` for devices with no BGP config |
| `infrahub/transforms/tests/bgp_yang/test.yml` | Smoke check + unit render tests for leaf1, spine1, leaf7 |
| `infrahub/transforms/tests/bgp_yang/leaf1/` | 3 peer-groups, 5 global neighbors, 2 global AFs |
| `infrahub/transforms/tests/bgp_yang/spine1/` | 1 peer-group (evpn/next-hop-unchanged), 16 neighbors (8 direct underlay + 8 EVPN), IPv4 AF activates individual sessions |
| `infrahub/transforms/tests/bgp_yang/leaf7/` | leaf1 pattern + VRF gold border session (AS 64999) + VRF-scoped IPv4 unicast AF |
| `.infrahub.yml` | Registers `bgp_intent` query and `bgp_yang_transform` |

## Validation

| Device | Expected output |
|--------|----------------|
| `leaf1` | 3 peer-groups, 5 global neighbors (underlay×2, iBGP×1, EVPN×2), 2 AFs, empty VRF sections |
| `spine1` | 1 peer-group (evpn, next-hop-unchanged), 16 neighbors (8 direct with `remote_asn`, 8 EVPN via peer-group), IPv4 AF activates individual sessions |
| `leaf7` | Same as leaf1 (AS 65004) + `vrf_neighbors: [{10.90.90.1, AS 64999, VRF gold}]` + `vrf_address_families: [{ipv4, VRF gold, active_sessions: [10.90.90.1]}]` |

```bash
infrahubctl render bgp_yang_transform device_name=leaf1
infrahubctl render bgp_yang_transform device_name=spine1
infrahubctl render bgp_yang_transform device_name=leaf7
```

## Design notes

- Follows identical conventions to existing transforms (#20–#22)
- All optional relationships (`remote_asn`, `peer_group`, `vrf`, `peer_device`, `update_source`, etc.) wrapped in `is defined and is not none` guards
- `send_community` value `"none"` (schema default) is normalised to `null` in the output — keeps the rendered JSON clean for downstream consumers
- VRF-scoped sessions and AFs are separated into `vrf_neighbors` / `vrf_address_families` arrays, each entry carrying a `"vrf"` key, so the template consumer can trivially iterate per-VRF without filtering
2026-03-01 13:22:51 +00:00

59 lines
2.2 KiB
YAML

---
schemas:
- infrahub/schemas
menus:
- infrahub/menus
objects:
- infrahub/objects/01-foundation.yml
- infrahub/objects/02-fabric.yml
- infrahub/objects/03-devices.yml
- infrahub/objects/04-interfaces.yml
- infrahub/objects/05-ipam.yml
- infrahub/objects/06-vlans-vxlan.yml
- infrahub/objects/07-interface-vlans.yml
- infrahub/objects/08-ipam-vlans.yml
- infrahub/objects/09-bgp.yml
- infrahub/objects/10-bgp-sessions.yml
- infrahub/objects/11-vrfs.yml
- infrahub/objects/12-mlag.yml
queries:
- name: vlan_intent
file_path: infrahub/transforms/queries/vlan_intent.gql
- name: interface_intent
file_path: infrahub/transforms/queries/interface_intent.gql
- name: vxlan_intent
file_path: infrahub/transforms/queries/vxlan_intent.gql
- name: vrf_intent
file_path: infrahub/transforms/queries/vrf_intent.gql
- name: mlag_intent
file_path: infrahub/transforms/queries/mlag_intent.gql
- name: bgp_intent
file_path: infrahub/transforms/queries/bgp_intent.gql
jinja2_transforms:
- name: vlan_yang_transform
description: "Generate VLAN configuration payload from Infrahub intent"
query: vlan_intent
template_path: infrahub/transforms/templates/vlan_yang.j2
- name: interface_yang_transform
description: "Generate interface configuration payload from Infrahub intent"
query: interface_intent
template_path: infrahub/transforms/templates/interface_yang.j2
- name: vxlan_yang_transform
description: "Generate VXLAN/VTEP configuration payload from Infrahub intent"
query: vxlan_intent
template_path: infrahub/transforms/templates/vxlan_yang.j2
- name: vrf_yang_transform
description: "Generate VRF/L3VNI configuration payload from Infrahub intent"
query: vrf_intent
template_path: infrahub/transforms/templates/vrf_yang.j2
- name: mlag_yang_transform
description: "Generate MLAG configuration payload from Infrahub intent"
query: mlag_intent
template_path: infrahub/transforms/templates/mlag_yang.j2
- name: bgp_yang_transform
description: "Generate BGP configuration payload from Infrahub intent"
query: bgp_intent
template_path: infrahub/transforms/templates/bgp_yang.j2