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>
351 lines
7.5 KiB
JSON
351 lines
7.5 KiB
JSON
{
|
|
"data": {
|
|
"InfraInterfaceLoopback": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Loopback0"
|
|
},
|
|
"description": {
|
|
"value": "Router-ID"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"ip_addresses": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"address": {
|
|
"value": "10.0.250.11/32"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Loopback1"
|
|
},
|
|
"description": {
|
|
"value": "VTEP"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"ip_addresses": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"address": {
|
|
"value": "10.0.255.11/32"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"InfraInterfaceEthernet": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Ethernet1"
|
|
},
|
|
"description": {
|
|
"value": "host1"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"speed": {
|
|
"value": null
|
|
},
|
|
"mode": {
|
|
"value": "trunk"
|
|
},
|
|
"lag": {
|
|
"node": {
|
|
"name": {
|
|
"value": "Port-Channel1"
|
|
}
|
|
}
|
|
},
|
|
"ip_addresses": {
|
|
"edges": []
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Ethernet10"
|
|
},
|
|
"description": {
|
|
"value": "mlag peer link"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"speed": {
|
|
"value": null
|
|
},
|
|
"mode": {
|
|
"value": "trunk"
|
|
},
|
|
"lag": {
|
|
"node": {
|
|
"name": {
|
|
"value": "Port-Channel999"
|
|
}
|
|
}
|
|
},
|
|
"ip_addresses": {
|
|
"edges": []
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Ethernet11"
|
|
},
|
|
"description": {
|
|
"value": "spine1"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": 9214
|
|
},
|
|
"speed": {
|
|
"value": null
|
|
},
|
|
"mode": {
|
|
"value": "routed"
|
|
},
|
|
"lag": null,
|
|
"ip_addresses": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"address": {
|
|
"value": "10.0.1.1/31"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Ethernet12"
|
|
},
|
|
"description": {
|
|
"value": "spine2"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": 9214
|
|
},
|
|
"speed": {
|
|
"value": null
|
|
},
|
|
"mode": {
|
|
"value": "routed"
|
|
},
|
|
"lag": null,
|
|
"ip_addresses": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"address": {
|
|
"value": "10.0.2.1/31"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"InfraInterfaceVlan": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Vlan4090"
|
|
},
|
|
"description": {
|
|
"value": "MLAG Peer-Link"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"virtual_router_address": {
|
|
"value": null
|
|
},
|
|
"autostate": {
|
|
"value": false
|
|
},
|
|
"vlan": {
|
|
"node": {
|
|
"vlan_id": {
|
|
"value": 4090
|
|
}
|
|
}
|
|
},
|
|
"ip_addresses": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"address": {
|
|
"value": "10.255.255.0/31"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Vlan4091"
|
|
},
|
|
"description": {
|
|
"value": "MLAG iBGP Peering"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": 9214
|
|
},
|
|
"virtual_router_address": {
|
|
"value": null
|
|
},
|
|
"autostate": {
|
|
"value": true
|
|
},
|
|
"vlan": {
|
|
"node": {
|
|
"vlan_id": {
|
|
"value": 4091
|
|
}
|
|
}
|
|
},
|
|
"ip_addresses": {
|
|
"edges": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"InfraInterfaceLag": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Port-Channel1"
|
|
},
|
|
"description": {
|
|
"value": "host1"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"lacp_mode": {
|
|
"value": "active"
|
|
},
|
|
"mlag_id": {
|
|
"value": 1
|
|
},
|
|
"members": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Ethernet1"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"ip_addresses": {
|
|
"edges": []
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Port-Channel999"
|
|
},
|
|
"description": {
|
|
"value": "MLAG Peer"
|
|
},
|
|
"enabled": {
|
|
"value": true
|
|
},
|
|
"mtu": {
|
|
"value": null
|
|
},
|
|
"lacp_mode": {
|
|
"value": "active"
|
|
},
|
|
"mlag_id": {
|
|
"value": null
|
|
},
|
|
"members": {
|
|
"edges": [
|
|
{
|
|
"node": {
|
|
"name": {
|
|
"value": "Ethernet10"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"ip_addresses": {
|
|
"edges": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|