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:
@@ -28,6 +28,8 @@ queries:
|
|||||||
file_path: infrahub/transforms/queries/vrf_intent.gql
|
file_path: infrahub/transforms/queries/vrf_intent.gql
|
||||||
- name: mlag_intent
|
- name: mlag_intent
|
||||||
file_path: infrahub/transforms/queries/mlag_intent.gql
|
file_path: infrahub/transforms/queries/mlag_intent.gql
|
||||||
|
- name: bgp_intent
|
||||||
|
file_path: infrahub/transforms/queries/bgp_intent.gql
|
||||||
|
|
||||||
jinja2_transforms:
|
jinja2_transforms:
|
||||||
- name: vlan_yang_transform
|
- name: vlan_yang_transform
|
||||||
@@ -50,3 +52,7 @@ jinja2_transforms:
|
|||||||
description: "Generate MLAG configuration payload from Infrahub intent"
|
description: "Generate MLAG configuration payload from Infrahub intent"
|
||||||
query: mlag_intent
|
query: mlag_intent
|
||||||
template_path: infrahub/transforms/templates/mlag_yang.j2
|
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
|
||||||
|
|||||||
105
infrahub/transforms/queries/bgp_intent.gql
Normal file
105
infrahub/transforms/queries/bgp_intent.gql
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
query BgpIntent($device_name: String!) {
|
||||||
|
InfraBGPRouterConfig(device__name__value: $device_name) {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
router_id { value }
|
||||||
|
default_ipv4_unicast { value }
|
||||||
|
log_neighbor_changes { value }
|
||||||
|
ecmp_max_paths { value }
|
||||||
|
ecmp_max_ecmp { value }
|
||||||
|
ebgp_distance { value }
|
||||||
|
ibgp_distance { value }
|
||||||
|
local_distance { value }
|
||||||
|
local_asn {
|
||||||
|
node {
|
||||||
|
asn { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
peer_groups {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
name { value }
|
||||||
|
peer_group_type { value }
|
||||||
|
update_source { value }
|
||||||
|
ebgp_multihop { value }
|
||||||
|
send_community { value }
|
||||||
|
next_hop_self { value }
|
||||||
|
next_hop_unchanged { value }
|
||||||
|
maximum_routes { value }
|
||||||
|
maximum_routes_warning_only { value }
|
||||||
|
remote_asn {
|
||||||
|
node {
|
||||||
|
asn { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sessions {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
peer_address { value }
|
||||||
|
description { value }
|
||||||
|
enabled { value }
|
||||||
|
peer_group {
|
||||||
|
node {
|
||||||
|
name { value }
|
||||||
|
local_identifier { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remote_asn {
|
||||||
|
node {
|
||||||
|
asn { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vrf {
|
||||||
|
node {
|
||||||
|
name { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
peer_device {
|
||||||
|
node {
|
||||||
|
name { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InfraBGPAddressFamily(bgp_config__device__name__value: $device_name) {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
afi { value }
|
||||||
|
safi { value }
|
||||||
|
vrf {
|
||||||
|
node {
|
||||||
|
name { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
active_peer_groups {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
name { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
active_sessions {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
peer_address { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
networks {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
address { value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
194
infrahub/transforms/templates/bgp_yang.j2
Normal file
194
infrahub/transforms/templates/bgp_yang.j2
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
{#
|
||||||
|
bgp_yang.j2 — Produce a JSON object with the complete BGP configuration
|
||||||
|
for a single device.
|
||||||
|
|
||||||
|
Input: GraphQL response from bgp_intent query.
|
||||||
|
Returns [] if the device has no BGP router config.
|
||||||
|
|
||||||
|
Output structure:
|
||||||
|
{
|
||||||
|
"bgp": {
|
||||||
|
"global": { asn, router_id, flags, distance, ecmp },
|
||||||
|
"peer_groups": [ ... ],
|
||||||
|
"neighbors": [ ... global-VRF sessions ... ],
|
||||||
|
"address_families": [ ... global-VRF AFs ... ],
|
||||||
|
"vrf_neighbors": [ ... VRF-scoped sessions ... ],
|
||||||
|
"vrf_address_families": [ ... VRF-scoped AFs ... ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#}
|
||||||
|
{%- set router_configs = data.InfraBGPRouterConfig.edges -%}
|
||||||
|
{%- set af_edges = data.InfraBGPAddressFamily.edges -%}
|
||||||
|
|
||||||
|
{%- if router_configs | length == 0 -%}
|
||||||
|
[]
|
||||||
|
{%- else -%}
|
||||||
|
{%- set rc = router_configs[0].node -%}
|
||||||
|
|
||||||
|
{#— Global section —#}
|
||||||
|
{%- set asn = none -%}
|
||||||
|
{%- if rc.local_asn is defined and rc.local_asn is not none and rc.local_asn.node is not none -%}
|
||||||
|
{%- set asn = rc.local_asn.node.asn.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#— Build peer_groups list —#}
|
||||||
|
{%- set peer_groups = [] -%}
|
||||||
|
{%- for pg_edge in rc.peer_groups.edges -%}
|
||||||
|
{%- set pg = pg_edge.node -%}
|
||||||
|
{%- set pg_remote_asn = none -%}
|
||||||
|
{%- if pg.remote_asn is defined and pg.remote_asn is not none and pg.remote_asn.node is not none -%}
|
||||||
|
{%- set pg_remote_asn = pg.remote_asn.node.asn.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- set pg_send_community = none -%}
|
||||||
|
{%- if pg.send_community is defined and pg.send_community is not none and pg.send_community.value is not none and pg.send_community.value != "none" -%}
|
||||||
|
{%- set pg_send_community = pg.send_community.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- set pg_update_source = none -%}
|
||||||
|
{%- if pg.update_source is defined and pg.update_source is not none and pg.update_source.value is not none -%}
|
||||||
|
{%- set pg_update_source = pg.update_source.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- set pg_ebgp_multihop = none -%}
|
||||||
|
{%- if pg.ebgp_multihop is defined and pg.ebgp_multihop is not none and pg.ebgp_multihop.value is not none -%}
|
||||||
|
{%- set pg_ebgp_multihop = pg.ebgp_multihop.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- set pg_max_routes = none -%}
|
||||||
|
{%- if pg.maximum_routes is defined and pg.maximum_routes is not none and pg.maximum_routes.value is not none -%}
|
||||||
|
{%- set pg_max_routes = pg.maximum_routes.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- set _ = peer_groups.append({
|
||||||
|
"name": pg.name.value,
|
||||||
|
"type": pg.peer_group_type.value,
|
||||||
|
"remote_asn": pg_remote_asn,
|
||||||
|
"update_source": pg_update_source,
|
||||||
|
"ebgp_multihop": pg_ebgp_multihop,
|
||||||
|
"send_community": pg_send_community,
|
||||||
|
"next_hop_self": pg.next_hop_self.value,
|
||||||
|
"next_hop_unchanged": pg.next_hop_unchanged.value,
|
||||||
|
"maximum_routes": pg_max_routes,
|
||||||
|
"maximum_routes_warning_only": pg.maximum_routes_warning_only.value
|
||||||
|
}) -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
|
||||||
|
{#— Split sessions into global and VRF-scoped —#}
|
||||||
|
{%- set neighbors = [] -%}
|
||||||
|
{%- set vrf_neighbors = [] -%}
|
||||||
|
{%- for sess_edge in rc.sessions.edges -%}
|
||||||
|
{%- set sess = sess_edge.node -%}
|
||||||
|
|
||||||
|
{%- set sess_peer_group = none -%}
|
||||||
|
{%- if sess.peer_group is defined and sess.peer_group is not none and sess.peer_group.node is not none -%}
|
||||||
|
{%- set sess_peer_group = sess.peer_group.node.name.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set sess_remote_asn = none -%}
|
||||||
|
{%- if sess.remote_asn is defined and sess.remote_asn is not none and sess.remote_asn.node is not none -%}
|
||||||
|
{%- set sess_remote_asn = sess.remote_asn.node.asn.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set sess_vrf = none -%}
|
||||||
|
{%- if sess.vrf is defined and sess.vrf is not none and sess.vrf.node is not none -%}
|
||||||
|
{%- set sess_vrf = sess.vrf.node.name.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set sess_obj = {
|
||||||
|
"peer_address": sess.peer_address.value,
|
||||||
|
"description": sess.description.value | default(none),
|
||||||
|
"enabled": sess.enabled.value,
|
||||||
|
"peer_group": sess_peer_group,
|
||||||
|
"remote_asn": sess_remote_asn
|
||||||
|
} -%}
|
||||||
|
|
||||||
|
{%- if sess_vrf is not none -%}
|
||||||
|
{%- set vrf_sess_obj = {
|
||||||
|
"peer_address": sess.peer_address.value,
|
||||||
|
"description": sess.description.value | default(none),
|
||||||
|
"enabled": sess.enabled.value,
|
||||||
|
"peer_group": sess_peer_group,
|
||||||
|
"remote_asn": sess_remote_asn,
|
||||||
|
"vrf": sess_vrf
|
||||||
|
} -%}
|
||||||
|
{%- set _ = vrf_neighbors.append(vrf_sess_obj) -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set _ = neighbors.append(sess_obj) -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
|
||||||
|
{#— Split address families into global and VRF-scoped —#}
|
||||||
|
{%- set address_families = [] -%}
|
||||||
|
{%- set vrf_address_families = [] -%}
|
||||||
|
{%- for af_edge in af_edges -%}
|
||||||
|
{%- set af = af_edge.node -%}
|
||||||
|
|
||||||
|
{%- set af_vrf = none -%}
|
||||||
|
{%- if af.vrf is defined and af.vrf is not none and af.vrf.node is not none -%}
|
||||||
|
{%- set af_vrf = af.vrf.node.name.value -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set af_active_pgs = [] -%}
|
||||||
|
{%- for pg_edge in af.active_peer_groups.edges -%}
|
||||||
|
{%- set _ = af_active_pgs.append(pg_edge.node.name.value) -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
|
||||||
|
{%- set af_active_sess = [] -%}
|
||||||
|
{%- if af.active_sessions is defined and af.active_sessions is not none -%}
|
||||||
|
{%- for s_edge in af.active_sessions.edges -%}
|
||||||
|
{%- set _ = af_active_sess.append(s_edge.node.peer_address.value) -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set af_networks = [] -%}
|
||||||
|
{%- if af.networks is defined and af.networks is not none -%}
|
||||||
|
{%- for net_edge in af.networks.edges -%}
|
||||||
|
{%- set _ = af_networks.append(net_edge.node.address.value) -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- set af_obj = {
|
||||||
|
"afi": af.afi.value,
|
||||||
|
"safi": af.safi.value,
|
||||||
|
"active_peer_groups": af_active_pgs,
|
||||||
|
"active_sessions": af_active_sess,
|
||||||
|
"networks": af_networks
|
||||||
|
} -%}
|
||||||
|
|
||||||
|
{%- if af_vrf is not none -%}
|
||||||
|
{%- set vrf_af_obj = {
|
||||||
|
"afi": af.afi.value,
|
||||||
|
"safi": af.safi.value,
|
||||||
|
"vrf": af_vrf,
|
||||||
|
"active_peer_groups": af_active_pgs,
|
||||||
|
"active_sessions": af_active_sess,
|
||||||
|
"networks": af_networks
|
||||||
|
} -%}
|
||||||
|
{%- set _ = vrf_address_families.append(vrf_af_obj) -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set _ = address_families.append(af_obj) -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
|
||||||
|
{%- set result = {
|
||||||
|
"bgp": {
|
||||||
|
"global": {
|
||||||
|
"asn": asn,
|
||||||
|
"router_id": rc.router_id.value,
|
||||||
|
"default_ipv4_unicast": rc.default_ipv4_unicast.value,
|
||||||
|
"log_neighbor_changes": rc.log_neighbor_changes.value,
|
||||||
|
"distance": {
|
||||||
|
"ebgp": rc.ebgp_distance.value,
|
||||||
|
"ibgp": rc.ibgp_distance.value,
|
||||||
|
"local": rc.local_distance.value
|
||||||
|
},
|
||||||
|
"ecmp": {
|
||||||
|
"max_paths": rc.ecmp_max_paths.value,
|
||||||
|
"max_ecmp": rc.ecmp_max_ecmp.value
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"peer_groups": peer_groups,
|
||||||
|
"neighbors": neighbors,
|
||||||
|
"address_families": address_families,
|
||||||
|
"vrf_neighbors": vrf_neighbors,
|
||||||
|
"vrf_address_families": vrf_address_families
|
||||||
|
}
|
||||||
|
} -%}
|
||||||
|
{{ result | tojson(indent=2) }}
|
||||||
|
{%- endif -%}
|
||||||
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