feat: Add Infrahub Jinja2 transform for VRF/L3VNI configuration (#21) (#25)

## Summary

Implements Infrahub Jinja2 Transform for VRF/L3VNI configuration, generating structured JSON payloads from Infrahub intent data. Closes #21.

## What's included

- **GraphQL query** (`transforms/queries/vrf_intent.gql`): Queries `InfraVRFDeviceAssignment` by device name, fetching VRF details, L3VNI, route targets, and device-specific route distinguisher
- **Jinja2 transform** (`transforms/templates/vrf_yang.j2`): Renders VRF config payloads with defensive null handling (lessons learned from #20)
- **`.infrahub.yml`** updated with the new query and transform definitions
- **Tests** (`transforms/tests/vrf_yang/`) using correct Infrahub pytest format (`jinja2-transform-smoke` + `jinja2-transform-unit-render`)

## Validation

All transforms render correctly:

| Device | Expected | Result |
|--------|----------|--------|
| `leaf3` | VRF gold, RD `10.0.250.13:1`, L3VNI 100001 |  |
| `leaf7` | VRF gold, RD `10.0.250.17:1`, L3VNI 100001 |  |
| `leaf1` | Empty array (no VRF assignment) |  |
| `spine1` | Empty array (no VRF assignment) |  |

## Usage

```bash
# Local debugging
infrahubctl render vrf_yang_transform device_name=leaf3

# API endpoint
GET /api/transform/jinja2/vrf_yang_transform?device_name=leaf3
```

## Related

- Depends on: #20 (base transforms infrastructure, already merged)
- Reference: Arista EVPN Type-5 / L3VXLAN configuration from lab topology
This commit was merged in pull request #25.
This commit is contained in:
2026-03-01 10:45:01 +00:00
parent 668e9cbada
commit a105e44bbd
6 changed files with 246 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
{
"data": {
"InfraVRFDeviceAssignment": {
"edges": [
{
"node": {
"route_distinguisher": {
"value": "10.0.250.13:1"
},
"vrf": {
"node": {
"name": {
"value": "gold"
},
"description": {
"value": "VRF gold - L3 VXLAN with symmetric IRB"
},
"route_distinguisher": {
"value": null
},
"l3vni": {
"node": {
"vni": {
"value": 100001
},
"vni_type": {
"value": "l3vni"
}
}
},
"import_targets": {
"edges": [
{
"node": {
"target": {
"value": "1:100001"
}
}
}
]
},
"export_targets": {
"edges": [
{
"node": {
"target": {
"value": "1:100001"
}
}
}
]
}
}
},
"import_targets": {
"edges": [
{
"node": {
"target": {
"value": "1:100001"
}
}
}
]
},
"export_targets": {
"edges": [
{
"node": {
"target": {
"value": "1:100001"
}
}
}
]
}
}
}
]
}
}
}

View File

@@ -0,0 +1,15 @@
[
{
"description": "VRF gold - L3 VXLAN with symmetric IRB",
"export_targets": [
"1:100001"
],
"import_targets": [
"1:100001"
],
"l3vni": 100001,
"redistribute_connected": true,
"route_distinguisher": "10.0.250.13:1",
"vrf_name": "gold"
}
]

View File

@@ -0,0 +1,15 @@
---
version: "1.0"
infrahub_tests:
- resource: Jinja2Transform
resource_name: vrf_yang_transform
tests:
- name: smoke_check
spec:
kind: jinja2-transform-smoke
- name: render_leaf3
spec:
kind: jinja2-transform-unit-render
directory: infrahub/transforms/tests/vrf_yang
input: input.json
output: output.json