Replace all `null` literals with `none` (valid Jinja2/Python) in all three
templates. Add explicit `is defined and is not none and .node is not none`
guards before accessing nested nodes on optional GraphQL relationships, to
avoid `Undefined is not JSON serializable` errors at render time.
Also add `| default(none)` on optional scalar attributes (speed, mode,
lacp_mode, mlag_id, mtu, description, virtual_router_address,
route_distinguisher, learn_restrict, vlan_type, trunk_groups) so that
Infrahub `Undefined` values from unset optional fields are safely coerced
to JSON null rather than crashing tojson serialization.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add three GraphQL queries, Jinja2 templates, and integration tests for
generating YANG-style JSON configuration payloads from Infrahub intent data,
suitable for gNMI Set operations on Arista EOS devices.
Queries (transforms/queries/):
- vlan_intent.gql: Fetches VLANs for a device via VTEP mappings and SVI
interfaces, including VNI associations.
- interface_intent.gql: Fetches all interface types (loopback, ethernet, vlan,
lag) with IP addresses and type-specific attributes.
- vxlan_intent.gql: Fetches VTEP config, VLAN-to-VNI mappings, and VRF-to-VNI
mappings (L3VNI) via VRF device assignments.
Templates (transforms/templates/):
- vlan_yang.j2: Merges VLANs from both VTEP and SVI sources, deduplicates by
vlan_id, and emits a sorted JSON array.
- interface_yang.j2: Emits a JSON array of interfaces sorted by name, with a
"type" discriminator field for each interface kind.
- vxlan_yang.j2: Emits a JSON object with vtep config, vlan_vni_mappings, and
vrf_vni_mappings sections.
Integration tests (transforms/tests/):
- One test directory per transform with input.json (sample GraphQL response for
leaf1), output.json (expected result), and test.yml config.
- Test data reflects the lab topology: leaf1 VTEP 10.0.255.11, VLAN 40 / VNI
110040, MLAG VLANs 4090/4091, underlay Ethernet11/12.
.infrahub.yml updated with queries and jinja2_transforms sections.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>