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>
This commit is contained in:
180
infrahub/transforms/tests/bgp_yang/leaf1/input.json
Normal file
180
infrahub/transforms/tests/bgp_yang/leaf1/input.json
Normal file
@@ -0,0 +1,180 @@
|
||||
{
|
||||
"data": {
|
||||
"InfraBGPRouterConfig": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"router_id": { "value": "10.0.250.11" },
|
||||
"default_ipv4_unicast": { "value": false },
|
||||
"log_neighbor_changes": { "value": true },
|
||||
"ecmp_max_paths": { "value": 4 },
|
||||
"ecmp_max_ecmp": { "value": 64 },
|
||||
"ebgp_distance": { "value": 20 },
|
||||
"ibgp_distance": { "value": 200 },
|
||||
"local_distance": { "value": 200 },
|
||||
"local_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65001 }
|
||||
}
|
||||
},
|
||||
"peer_groups": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "underlay" },
|
||||
"peer_group_type": { "value": "underlay" },
|
||||
"update_source": { "value": null },
|
||||
"ebgp_multihop": { "value": null },
|
||||
"send_community": { "value": "none" },
|
||||
"next_hop_self": { "value": false },
|
||||
"next_hop_unchanged": { "value": false },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65000 }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "underlay_ibgp" },
|
||||
"peer_group_type": { "value": "underlay_ibgp" },
|
||||
"update_source": { "value": null },
|
||||
"ebgp_multihop": { "value": null },
|
||||
"send_community": { "value": "none" },
|
||||
"next_hop_self": { "value": true },
|
||||
"next_hop_unchanged": { "value": false },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65001 }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "evpn" },
|
||||
"peer_group_type": { "value": "evpn" },
|
||||
"update_source": { "value": "Loopback0" },
|
||||
"ebgp_multihop": { "value": 3 },
|
||||
"send_community": { "value": "extended" },
|
||||
"next_hop_self": { "value": false },
|
||||
"next_hop_unchanged": { "value": false },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65000 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.0" },
|
||||
"description": { "value": "underlay to spine1" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "underlay" }, "local_identifier": { "value": "leaf1__underlay" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine1" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.2.0" },
|
||||
"description": { "value": "underlay to spine2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "underlay" }, "local_identifier": { "value": "leaf1__underlay" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine2" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.3.1" },
|
||||
"description": { "value": "iBGP to leaf2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "underlay_ibgp" }, "local_identifier": { "value": "leaf1__underlay_ibgp" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf2" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.1" },
|
||||
"description": { "value": "EVPN to spine1" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "leaf1__evpn" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine1" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.2" },
|
||||
"description": { "value": "EVPN to spine2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "leaf1__evpn" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine2" } } }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"InfraBGPAddressFamily": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "ipv4" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": null },
|
||||
"active_peer_groups": {
|
||||
"edges": [
|
||||
{ "node": { "name": { "value": "underlay" } } },
|
||||
{ "node": { "name": { "value": "underlay_ibgp" } } }
|
||||
]
|
||||
},
|
||||
"active_sessions": { "edges": [] },
|
||||
"networks": {
|
||||
"edges": [
|
||||
{ "node": { "address": { "value": "10.0.250.11/32" } } },
|
||||
{ "node": { "address": { "value": "10.0.255.11/32" } } }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "evpn" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": null },
|
||||
"active_peer_groups": {
|
||||
"edges": [
|
||||
{ "node": { "name": { "value": "evpn" } } }
|
||||
]
|
||||
},
|
||||
"active_sessions": { "edges": [] },
|
||||
"networks": { "edges": [] }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
120
infrahub/transforms/tests/bgp_yang/leaf1/output.json
Normal file
120
infrahub/transforms/tests/bgp_yang/leaf1/output.json
Normal file
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"bgp": {
|
||||
"global": {
|
||||
"asn": 65001,
|
||||
"router_id": "10.0.250.11",
|
||||
"default_ipv4_unicast": false,
|
||||
"log_neighbor_changes": true,
|
||||
"distance": {
|
||||
"ebgp": 20,
|
||||
"ibgp": 200,
|
||||
"local": 200
|
||||
},
|
||||
"ecmp": {
|
||||
"max_paths": 4,
|
||||
"max_ecmp": 64
|
||||
}
|
||||
},
|
||||
"peer_groups": [
|
||||
{
|
||||
"name": "underlay",
|
||||
"type": "underlay",
|
||||
"remote_asn": 65000,
|
||||
"update_source": null,
|
||||
"ebgp_multihop": null,
|
||||
"send_community": null,
|
||||
"next_hop_self": false,
|
||||
"next_hop_unchanged": false,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
},
|
||||
{
|
||||
"name": "underlay_ibgp",
|
||||
"type": "underlay_ibgp",
|
||||
"remote_asn": 65001,
|
||||
"update_source": null,
|
||||
"ebgp_multihop": null,
|
||||
"send_community": null,
|
||||
"next_hop_self": true,
|
||||
"next_hop_unchanged": false,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
},
|
||||
{
|
||||
"name": "evpn",
|
||||
"type": "evpn",
|
||||
"remote_asn": 65000,
|
||||
"update_source": "Loopback0",
|
||||
"ebgp_multihop": 3,
|
||||
"send_community": "extended",
|
||||
"next_hop_self": false,
|
||||
"next_hop_unchanged": false,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
}
|
||||
],
|
||||
"neighbors": [
|
||||
{
|
||||
"peer_address": "10.0.1.0",
|
||||
"description": "underlay to spine1",
|
||||
"enabled": true,
|
||||
"peer_group": "underlay",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.2.0",
|
||||
"description": "underlay to spine2",
|
||||
"enabled": true,
|
||||
"peer_group": "underlay",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.3.1",
|
||||
"description": "iBGP to leaf2",
|
||||
"enabled": true,
|
||||
"peer_group": "underlay_ibgp",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.1",
|
||||
"description": "EVPN to spine1",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.2",
|
||||
"description": "EVPN to spine2",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": null
|
||||
}
|
||||
],
|
||||
"address_families": [
|
||||
{
|
||||
"afi": "ipv4",
|
||||
"safi": "unicast",
|
||||
"active_peer_groups": [
|
||||
"underlay",
|
||||
"underlay_ibgp"
|
||||
],
|
||||
"active_sessions": [],
|
||||
"networks": [
|
||||
"10.0.250.11/32",
|
||||
"10.0.255.11/32"
|
||||
]
|
||||
},
|
||||
{
|
||||
"afi": "evpn",
|
||||
"safi": "unicast",
|
||||
"active_peer_groups": [
|
||||
"evpn"
|
||||
],
|
||||
"active_sessions": [],
|
||||
"networks": []
|
||||
}
|
||||
],
|
||||
"vrf_neighbors": [],
|
||||
"vrf_address_families": []
|
||||
}
|
||||
}
|
||||
205
infrahub/transforms/tests/bgp_yang/leaf7/input.json
Normal file
205
infrahub/transforms/tests/bgp_yang/leaf7/input.json
Normal file
@@ -0,0 +1,205 @@
|
||||
{
|
||||
"data": {
|
||||
"InfraBGPRouterConfig": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"router_id": { "value": "10.0.250.17" },
|
||||
"default_ipv4_unicast": { "value": false },
|
||||
"log_neighbor_changes": { "value": true },
|
||||
"ecmp_max_paths": { "value": 4 },
|
||||
"ecmp_max_ecmp": { "value": 64 },
|
||||
"ebgp_distance": { "value": 20 },
|
||||
"ibgp_distance": { "value": 200 },
|
||||
"local_distance": { "value": 200 },
|
||||
"local_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65004 }
|
||||
}
|
||||
},
|
||||
"peer_groups": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "underlay" },
|
||||
"peer_group_type": { "value": "underlay" },
|
||||
"update_source": { "value": null },
|
||||
"ebgp_multihop": { "value": null },
|
||||
"send_community": { "value": "none" },
|
||||
"next_hop_self": { "value": false },
|
||||
"next_hop_unchanged": { "value": false },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65000 }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "underlay_ibgp" },
|
||||
"peer_group_type": { "value": "underlay_ibgp" },
|
||||
"update_source": { "value": null },
|
||||
"ebgp_multihop": { "value": null },
|
||||
"send_community": { "value": "none" },
|
||||
"next_hop_self": { "value": true },
|
||||
"next_hop_unchanged": { "value": false },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65004 }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "evpn" },
|
||||
"peer_group_type": { "value": "evpn" },
|
||||
"update_source": { "value": "Loopback0" },
|
||||
"ebgp_multihop": { "value": 3 },
|
||||
"send_community": { "value": "extended" },
|
||||
"next_hop_self": { "value": false },
|
||||
"next_hop_unchanged": { "value": false },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65000 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.12" },
|
||||
"description": { "value": "underlay to spine1" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "underlay" }, "local_identifier": { "value": "leaf7__underlay" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine1" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.2.12" },
|
||||
"description": { "value": "underlay to spine2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "underlay" }, "local_identifier": { "value": "leaf7__underlay" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine2" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.3.7" },
|
||||
"description": { "value": "iBGP to leaf8" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "underlay_ibgp" }, "local_identifier": { "value": "leaf7__underlay_ibgp" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf8" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.1" },
|
||||
"description": { "value": "EVPN to spine1" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "leaf7__evpn" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine1" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.2" },
|
||||
"description": { "value": "EVPN to spine2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "leaf7__evpn" } } },
|
||||
"remote_asn": { "node": null },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "spine2" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.90.90.1" },
|
||||
"description": { "value": "border peering to AS 64999 in VRF gold" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 64999 } } },
|
||||
"vrf": { "node": { "name": { "value": "gold" } } },
|
||||
"peer_device": { "node": null }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"InfraBGPAddressFamily": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "ipv4" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": null },
|
||||
"active_peer_groups": {
|
||||
"edges": [
|
||||
{ "node": { "name": { "value": "underlay" } } },
|
||||
{ "node": { "name": { "value": "underlay_ibgp" } } }
|
||||
]
|
||||
},
|
||||
"active_sessions": { "edges": [] },
|
||||
"networks": {
|
||||
"edges": [
|
||||
{ "node": { "address": { "value": "10.0.250.17/32" } } },
|
||||
{ "node": { "address": { "value": "10.0.255.14/32" } } }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "evpn" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": null },
|
||||
"active_peer_groups": {
|
||||
"edges": [
|
||||
{ "node": { "name": { "value": "evpn" } } }
|
||||
]
|
||||
},
|
||||
"active_sessions": { "edges": [] },
|
||||
"networks": { "edges": [] }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "ipv4" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": { "name": { "value": "gold" } } },
|
||||
"active_peer_groups": { "edges": [] },
|
||||
"active_sessions": {
|
||||
"edges": [
|
||||
{ "node": { "peer_address": { "value": "10.90.90.1" } } }
|
||||
]
|
||||
},
|
||||
"networks": { "edges": [] }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
140
infrahub/transforms/tests/bgp_yang/leaf7/output.json
Normal file
140
infrahub/transforms/tests/bgp_yang/leaf7/output.json
Normal file
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"bgp": {
|
||||
"global": {
|
||||
"asn": 65004,
|
||||
"router_id": "10.0.250.17",
|
||||
"default_ipv4_unicast": false,
|
||||
"log_neighbor_changes": true,
|
||||
"distance": {
|
||||
"ebgp": 20,
|
||||
"ibgp": 200,
|
||||
"local": 200
|
||||
},
|
||||
"ecmp": {
|
||||
"max_paths": 4,
|
||||
"max_ecmp": 64
|
||||
}
|
||||
},
|
||||
"peer_groups": [
|
||||
{
|
||||
"name": "underlay",
|
||||
"type": "underlay",
|
||||
"remote_asn": 65000,
|
||||
"update_source": null,
|
||||
"ebgp_multihop": null,
|
||||
"send_community": null,
|
||||
"next_hop_self": false,
|
||||
"next_hop_unchanged": false,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
},
|
||||
{
|
||||
"name": "underlay_ibgp",
|
||||
"type": "underlay_ibgp",
|
||||
"remote_asn": 65004,
|
||||
"update_source": null,
|
||||
"ebgp_multihop": null,
|
||||
"send_community": null,
|
||||
"next_hop_self": true,
|
||||
"next_hop_unchanged": false,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
},
|
||||
{
|
||||
"name": "evpn",
|
||||
"type": "evpn",
|
||||
"remote_asn": 65000,
|
||||
"update_source": "Loopback0",
|
||||
"ebgp_multihop": 3,
|
||||
"send_community": "extended",
|
||||
"next_hop_self": false,
|
||||
"next_hop_unchanged": false,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
}
|
||||
],
|
||||
"neighbors": [
|
||||
{
|
||||
"peer_address": "10.0.1.12",
|
||||
"description": "underlay to spine1",
|
||||
"enabled": true,
|
||||
"peer_group": "underlay",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.2.12",
|
||||
"description": "underlay to spine2",
|
||||
"enabled": true,
|
||||
"peer_group": "underlay",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.3.7",
|
||||
"description": "iBGP to leaf8",
|
||||
"enabled": true,
|
||||
"peer_group": "underlay_ibgp",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.1",
|
||||
"description": "EVPN to spine1",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": null
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.2",
|
||||
"description": "EVPN to spine2",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": null
|
||||
}
|
||||
],
|
||||
"address_families": [
|
||||
{
|
||||
"afi": "ipv4",
|
||||
"safi": "unicast",
|
||||
"active_peer_groups": [
|
||||
"underlay",
|
||||
"underlay_ibgp"
|
||||
],
|
||||
"active_sessions": [],
|
||||
"networks": [
|
||||
"10.0.250.17/32",
|
||||
"10.0.255.14/32"
|
||||
]
|
||||
},
|
||||
{
|
||||
"afi": "evpn",
|
||||
"safi": "unicast",
|
||||
"active_peer_groups": [
|
||||
"evpn"
|
||||
],
|
||||
"active_sessions": [],
|
||||
"networks": []
|
||||
}
|
||||
],
|
||||
"vrf_neighbors": [
|
||||
{
|
||||
"peer_address": "10.90.90.1",
|
||||
"description": "border peering to AS 64999 in VRF gold",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 64999,
|
||||
"vrf": "gold"
|
||||
}
|
||||
],
|
||||
"vrf_address_families": [
|
||||
{
|
||||
"afi": "ipv4",
|
||||
"safi": "unicast",
|
||||
"vrf": "gold",
|
||||
"active_peer_groups": [],
|
||||
"active_sessions": [
|
||||
"10.90.90.1"
|
||||
],
|
||||
"networks": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
266
infrahub/transforms/tests/bgp_yang/spine1/input.json
Normal file
266
infrahub/transforms/tests/bgp_yang/spine1/input.json
Normal file
@@ -0,0 +1,266 @@
|
||||
{
|
||||
"data": {
|
||||
"InfraBGPRouterConfig": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"router_id": { "value": "10.0.250.1" },
|
||||
"default_ipv4_unicast": { "value": false },
|
||||
"log_neighbor_changes": { "value": true },
|
||||
"ecmp_max_paths": { "value": 4 },
|
||||
"ecmp_max_ecmp": { "value": 64 },
|
||||
"ebgp_distance": { "value": 20 },
|
||||
"ibgp_distance": { "value": 200 },
|
||||
"local_distance": { "value": 200 },
|
||||
"local_asn": {
|
||||
"node": {
|
||||
"asn": { "value": 65000 }
|
||||
}
|
||||
},
|
||||
"peer_groups": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"name": { "value": "evpn" },
|
||||
"peer_group_type": { "value": "evpn" },
|
||||
"update_source": { "value": "Loopback0" },
|
||||
"ebgp_multihop": { "value": 3 },
|
||||
"send_community": { "value": "extended" },
|
||||
"next_hop_self": { "value": false },
|
||||
"next_hop_unchanged": { "value": true },
|
||||
"maximum_routes": { "value": 12000 },
|
||||
"maximum_routes_warning_only": { "value": true },
|
||||
"remote_asn": { "node": null }
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.1" },
|
||||
"description": { "value": "underlay to leaf1" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65001 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf1" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.3" },
|
||||
"description": { "value": "underlay to leaf2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65001 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf2" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.5" },
|
||||
"description": { "value": "underlay to leaf3" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65002 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf3" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.7" },
|
||||
"description": { "value": "underlay to leaf4" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65002 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf4" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.9" },
|
||||
"description": { "value": "underlay to leaf5" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65003 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf5" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.11" },
|
||||
"description": { "value": "underlay to leaf6" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65003 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf6" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.13" },
|
||||
"description": { "value": "underlay to leaf7" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65004 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf7" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.1.15" },
|
||||
"description": { "value": "underlay to leaf8" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": null },
|
||||
"remote_asn": { "node": { "asn": { "value": 65004 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf8" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.11" },
|
||||
"description": { "value": "EVPN to leaf1" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65001 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf1" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.12" },
|
||||
"description": { "value": "EVPN to leaf2" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65001 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf2" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.13" },
|
||||
"description": { "value": "EVPN to leaf3" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65002 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf3" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.14" },
|
||||
"description": { "value": "EVPN to leaf4" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65002 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf4" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.15" },
|
||||
"description": { "value": "EVPN to leaf5" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65003 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf5" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.16" },
|
||||
"description": { "value": "EVPN to leaf6" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65003 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf6" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.17" },
|
||||
"description": { "value": "EVPN to leaf7" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65004 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf7" } } }
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"peer_address": { "value": "10.0.250.18" },
|
||||
"description": { "value": "EVPN to leaf8" },
|
||||
"enabled": { "value": true },
|
||||
"peer_group": { "node": { "name": { "value": "evpn" }, "local_identifier": { "value": "spine1__evpn" } } },
|
||||
"remote_asn": { "node": { "asn": { "value": 65004 } } },
|
||||
"vrf": { "node": null },
|
||||
"peer_device": { "node": { "name": { "value": "leaf8" } } }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"InfraBGPAddressFamily": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "ipv4" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": null },
|
||||
"active_peer_groups": { "edges": [] },
|
||||
"active_sessions": {
|
||||
"edges": [
|
||||
{ "node": { "peer_address": { "value": "10.0.1.1" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.3" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.5" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.7" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.9" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.11" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.13" } } },
|
||||
{ "node": { "peer_address": { "value": "10.0.1.15" } } }
|
||||
]
|
||||
},
|
||||
"networks": {
|
||||
"edges": [
|
||||
{ "node": { "address": { "value": "10.0.250.1/32" } } }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"afi": { "value": "evpn" },
|
||||
"safi": { "value": "unicast" },
|
||||
"vrf": { "node": null },
|
||||
"active_peer_groups": {
|
||||
"edges": [
|
||||
{ "node": { "name": { "value": "evpn" } } }
|
||||
]
|
||||
},
|
||||
"active_sessions": { "edges": [] },
|
||||
"networks": { "edges": [] }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
178
infrahub/transforms/tests/bgp_yang/spine1/output.json
Normal file
178
infrahub/transforms/tests/bgp_yang/spine1/output.json
Normal file
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"bgp": {
|
||||
"global": {
|
||||
"asn": 65000,
|
||||
"router_id": "10.0.250.1",
|
||||
"default_ipv4_unicast": false,
|
||||
"log_neighbor_changes": true,
|
||||
"distance": {
|
||||
"ebgp": 20,
|
||||
"ibgp": 200,
|
||||
"local": 200
|
||||
},
|
||||
"ecmp": {
|
||||
"max_paths": 4,
|
||||
"max_ecmp": 64
|
||||
}
|
||||
},
|
||||
"peer_groups": [
|
||||
{
|
||||
"name": "evpn",
|
||||
"type": "evpn",
|
||||
"remote_asn": null,
|
||||
"update_source": "Loopback0",
|
||||
"ebgp_multihop": 3,
|
||||
"send_community": "extended",
|
||||
"next_hop_self": false,
|
||||
"next_hop_unchanged": true,
|
||||
"maximum_routes": 12000,
|
||||
"maximum_routes_warning_only": true
|
||||
}
|
||||
],
|
||||
"neighbors": [
|
||||
{
|
||||
"peer_address": "10.0.1.1",
|
||||
"description": "underlay to leaf1",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65001
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.3",
|
||||
"description": "underlay to leaf2",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65001
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.5",
|
||||
"description": "underlay to leaf3",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65002
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.7",
|
||||
"description": "underlay to leaf4",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65002
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.9",
|
||||
"description": "underlay to leaf5",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65003
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.11",
|
||||
"description": "underlay to leaf6",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65003
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.13",
|
||||
"description": "underlay to leaf7",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65004
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.1.15",
|
||||
"description": "underlay to leaf8",
|
||||
"enabled": true,
|
||||
"peer_group": null,
|
||||
"remote_asn": 65004
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.11",
|
||||
"description": "EVPN to leaf1",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65001
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.12",
|
||||
"description": "EVPN to leaf2",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65001
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.13",
|
||||
"description": "EVPN to leaf3",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65002
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.14",
|
||||
"description": "EVPN to leaf4",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65002
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.15",
|
||||
"description": "EVPN to leaf5",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65003
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.16",
|
||||
"description": "EVPN to leaf6",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65003
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.17",
|
||||
"description": "EVPN to leaf7",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65004
|
||||
},
|
||||
{
|
||||
"peer_address": "10.0.250.18",
|
||||
"description": "EVPN to leaf8",
|
||||
"enabled": true,
|
||||
"peer_group": "evpn",
|
||||
"remote_asn": 65004
|
||||
}
|
||||
],
|
||||
"address_families": [
|
||||
{
|
||||
"afi": "ipv4",
|
||||
"safi": "unicast",
|
||||
"active_peer_groups": [],
|
||||
"active_sessions": [
|
||||
"10.0.1.1",
|
||||
"10.0.1.3",
|
||||
"10.0.1.5",
|
||||
"10.0.1.7",
|
||||
"10.0.1.9",
|
||||
"10.0.1.11",
|
||||
"10.0.1.13",
|
||||
"10.0.1.15"
|
||||
],
|
||||
"networks": [
|
||||
"10.0.250.1/32"
|
||||
]
|
||||
},
|
||||
{
|
||||
"afi": "evpn",
|
||||
"safi": "unicast",
|
||||
"active_peer_groups": [
|
||||
"evpn"
|
||||
],
|
||||
"active_sessions": [],
|
||||
"networks": []
|
||||
}
|
||||
],
|
||||
"vrf_neighbors": [],
|
||||
"vrf_address_families": []
|
||||
}
|
||||
}
|
||||
27
infrahub/transforms/tests/bgp_yang/test.yml
Normal file
27
infrahub/transforms/tests/bgp_yang/test.yml
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
version: "1.0"
|
||||
infrahub_tests:
|
||||
- resource: Jinja2Transform
|
||||
resource_name: bgp_yang_transform
|
||||
tests:
|
||||
- name: smoke_check
|
||||
spec:
|
||||
kind: jinja2-transform-smoke
|
||||
- name: render_leaf1
|
||||
spec:
|
||||
kind: jinja2-transform-unit-render
|
||||
directory: infrahub/transforms/tests/bgp_yang/leaf1
|
||||
input: input.json
|
||||
output: output.json
|
||||
- name: render_spine1
|
||||
spec:
|
||||
kind: jinja2-transform-unit-render
|
||||
directory: infrahub/transforms/tests/bgp_yang/spine1
|
||||
input: input.json
|
||||
output: output.json
|
||||
- name: render_leaf7
|
||||
spec:
|
||||
kind: jinja2-transform-unit-render
|
||||
directory: infrahub/transforms/tests/bgp_yang/leaf7
|
||||
input: input.json
|
||||
output: output.json
|
||||
Reference in New Issue
Block a user