{# Routing and VXLAN functionnalities #} service routing protocols model multi-agent ip routing {# Interfaces configuration #} {%- for interface in device.interfaces.all() %} interface {{ interface.name }} {%- if interface.description %} description {{ interface.description }} {%- endif %} {%- if interface.name == 'Loopback0' %} description VTEP {%- endif %} {%- if interface.name == 'Ethernet3' %} switchport mode trunk no shutdown mtu 9214 {%- else %} no shutdown no switchport {%- set ip_address = interface.ip_addresses.first() %} {%- if ip_address %} ip address {{ ip_address.address }} {%- endif %} mtu 9214 {%- endif %} ! {%- endfor %} {# BGP Route-Maps and Prefix Lists #} {%- set loopback_ip = device.interfaces.get(name='Loopback0').ip_addresses.first().address %} ip prefix-list VTEP_PREFIX seq 10 permit {{ loopback_ip }} ! route-map RMAP_VTEP permit 10 match ip address prefix-list VTEP_PREFIX ! {# Complete BGP Configuration #} {%- set router_id = loopback_ip.ip %} router bgp {{ device.custom_field_data.ASN }} router-id {{ router_id }} maximum-paths 4 ecmp 4 ! neighbor SPINE_GROUP peer group neighbor SPINE_GROUP allowas-in 1 neighbor SPINE_GROUP ebgp-multihop 4 neighbor SPINE_GROUP send-community extended neighbor SPINE_GROUP maximum-routes 12000 ! neighbor VTEP_GROUP peer group neighbor VTEP_GROUP ebgp-multihop 5 neighbor VTEP_GROUP send-community extended {%- for interface in device.interfaces.all() %} {%- if interface.connected_endpoints and interface.name != 'Ethernet3' and interface.name != 'Loopback0' %} {%- set local_ip = interface.ip_addresses.first() %} {%- if local_ip %} {%- for remote_interface in interface.connected_endpoints %} {%- set remote_ip = remote_interface.ip_addresses.first() %} {%- if remote_ip %} neighbor {{ remote_ip.address.ip }} peer group SPINE_GROUP neighbor {{ remote_ip.address.ip }} remote-as {{ remote_interface.device.custom_field_data.ASN }} {%- endif %} {%- endfor %} {%- endif %} {%- endif %} {%- endfor %} {%- set other_leafs = device.site.devices.filter(role__slug='leaf').exclude(id=device.id) %} {%- for leaf in other_leafs %} {%- set leaf_lo = leaf.interfaces.get(name='Loopback0').ip_addresses.first() %} {%- if leaf_lo %} neighbor {{ leaf_lo.address.ip }} peer group VTEP_GROUP neighbor {{ leaf_lo.address.ip }} remote-as {{ leaf.custom_field_data.ASN }} neighbor {{ leaf_lo.address.ip }} update-source Loopback0 {%- endif %} {%- endfor %} ! address-family ipv4 {%- for interface in device.interfaces.all() %} {%- if interface.connected_endpoints and interface.name != 'Ethernet3' and interface.name != 'Loopback0' %} {%- set local_ip = interface.ip_addresses.first() %} {%- if local_ip %} {%- for remote_interface in interface.connected_endpoints %} {%- set remote_ip = remote_interface.ip_addresses.first() %} {%- if remote_ip %} neighbor {{ remote_ip.address.ip }} activate {%- endif %} {%- endfor %} {%- endif %} {%- endif %} {%- endfor %} redistribute connected route-map RMAP_VTEP ! address-family evpn {%- for leaf in other_leafs %} {%- set leaf_lo = leaf.interfaces.get(name='Loopback0').ip_addresses.first() %} {%- if leaf_lo %} neighbor {{ leaf_lo.address.ip }} activate {%- endif %} {%- endfor %} ! {# VXLAN Configuration #} {%- if device.location and device.location.tenant %} {%- set tenant = device.location.tenant %} {%- set tenant_vlans = tenant.vlans.all() %} {%- set tenant_prefix = tenant.prefixes.first() %} {%- set tenant_l2vpns = tenant.l2vpns.filter(type='vxlan-evpn') %} {%- set loopback_ip = device.interfaces.get(name='Loopback0').ip_addresses.first().address.ip %} ip virtual-router mac-address 00:0a:bc:10:11:02 ! {%- for vlan in tenant_vlans %} vlan {{ vlan.vid }} name IRB_{{ tenant.name|upper }}_SERVICE ! interface Vlan{{ vlan.vid }} description {{ tenant.name }} Service Interface vrf {{ tenant.name|upper }} {%- if tenant_prefix %} {%- set network = tenant_prefix.prefix.network %} {%- set first_ip = network + 1 %} ip address virtual {{ first_ip }}/{{ tenant_prefix.prefix.prefixlen }} {%- endif %} ! {%- endfor %} {%- set spine_loopbacks = [] %} {%- for spine in device.site.devices.filter(role__slug='spine') %} {%- set spine_lo = spine.interfaces.get(name='Loopback0').ip_addresses.first() %} {%- if spine_lo %} {%- set _ = spine_loopbacks.append(spine_lo.address.ip) %} {%- endif %} {%- endfor %} {%- for l2vpn in tenant_l2vpns %} {%- set vxlan_index = loop.index %} interface Vxlan{{ vxlan_index }} description VTI vxlan source-interface Loopback0 {%- for vlan in tenant_vlans %} vxlan vlan {{ vlan.vid }} vni {{ l2vpn.identifier }} {%- for spine_ip in spine_loopbacks %} vxlan vlan {{ vlan.vid }} flood vtep {{ spine_ip }} {%- endfor %} {%- endfor %} ! {%- endfor %} router bgp {{ device.custom_field_data.ASN }} {%- for vlan in tenant_vlans %} {%- set l2vpn = tenant_l2vpns.first() %} {%- if l2vpn %} vlan {{ vlan.vid }} rd {{ loopback_ip }}:{{ l2vpn.identifier }} route-target both {{ l2vpn.identifier }}:{{ vlan.vid }} redistribute learned {%- endif %} {%- endfor %} {%- endif %}