File: //lib/python3.9/site-packages/ansible_collections/dellemc/os10/roles/os10_bgp/templates/os10_bgp.j2
#jinja2: trim_blocks: True, lstrip_blocks: True
{###########################################
Purpose:
Configure BGP commands for os10 Devices
os10_bgp:
asn: 12
router_id: 90.1.1.4
maxpath_ibgp: 2
maxpath_ebgp: 2
graceful_restart: true
log_neighbor_changes: true
fast_ext_fallover: false
always_compare_med: true
default_loc_pref: 1000
confederation:
identifier: 25
peers: 23 24
peers_state: present
route_reflector:
client_to_client: false
cluster_id: 4294967295
address_family_ipv4:
aggregate_address:
- ip_and_mask: 1.1.1.1/16
state: present
summary_only: true
dampening:
value: 15 750 2000 60
route_map: qq
state: present
ibgp_redist_internal:
state: present
address_family_ipv6:
aggregate_address:
- ip_and_mask: 2001:4898:5808:ffa0::/126
state: present
summary_only: true
ibgp_redist_internal:
state: present
best_path:
as_path: ignore
as_path_state: present
ignore_router_id: true
med:
- attribute: confed
state: present
ipv4_network:
- address: 101.1.1.0/30
state: present
ipv6_network:
- address: "2001:4898:5808:ffa0::/126"
state: present
neighbor:
- name: ebgp_pg
type: peergroup
bfd: yes
state: present
- name: ibgp_pg
type: peergroup
weight: 10
state: present
- type: ipv4
interface: vlan20
send_community:
- type: extended
state: present
address_family:
- type: l2vpn
activate: true
state: present
admin: up
state: present
- type: ipv4
description: "U_site2-spine1"
remote_asn: 11
ip: 192.168.10.1
peergroup: peer1
peergroup_state: present
peergroup_type: ibgp
adv_interval: 40
fall_over: present
password: bgppassword
route_reflector_client: true
src_loopback: 0
address_family:
- type: ipv4
activate: true
state: present
send_community:
- type: standard
state: present
state: present
- type: ipv4
remote_asn: 13
local_as: 10
weight: 10
ip: 192.168.12.3
address_family:
- type: ipv4
activate: true
allow_as_in: 5
next_hop_self: true
soft_reconf: true
add_path: both 3
route_map:
- name: qq
filter: in
state: present
max_prefix:
- count: 10
threshold: 80
warning: true
state: present
state: present
state: present
- type: ipv6
remote_asn: 14
ip: 2001:4898:5808:ffa2::1
state: present
- type: ipv6
description: "U_site2-spine1-Auto Discovered peers"
auto_peer: unnumbered-auto
ebgp_peergroup: ebgp_pg
ebgp_peergroup_state: absent
ibgp_peergroup: ibgp_pg
ibgp_peergroup_state: present
sender_loop_detect: true
password: bgppassword
address_family:
- type: ipv4
activate: true
sender_loop_detect: true
state: present
allow_as_in: 5
next_hop_self: true
soft_reconf: true
- type: l2vpn
activate: true
sender_loop_detect: false
state: present
send_community:
- type: standard
state: present
admin: up
state: present
redistribute:
- route_type: static
route_map_name: aa
address_type: ipv4
state: present
bfd_all_neighbors:
interval: 200
min_rx: 200
multiplier: 3
role: active
state: present
vrfs :
- name: "GREEN"
router_id: 1.1.1.1
address_family_ipv4:
aggregate_address:
- ip_and_mask: 1.1.1.1/16
state: present
summary_only: true
state: present
neighbor:
- name: ebgp_pg
type: peergroup
bfd: yes
state: present
- name: ibgp_pg
type: peergroup
weight: 10
state: present
- type: ipv4
interface: vlan20
send_community:
- type: extended
state: present
address_family:
- type: l2vpn
activate: true
state: present
admin: up
state: present
- type: ipv4
description: "U_site2-spine1"
remote_asn: 11
ip: 192.168.10.1
peergroup: peer1
peergroup_state: present
peergroup_type: ibgp
adv_interval: 40
fall_over: present
password: bgppassword
route_reflector_client: true
src_loopback: 0
address_family:
- type: ipv4
activate: true
state: present
send_community:
- type: standard
state: present
state: present
- type: ipv4
remote_asn: 13
local_as: 10
weight: 10
ip: 192.168.12.3
address_family:
- type: ipv4
activate: true
allow_as_in: 5
next_hop_self: true
soft_reconf: true
add_path: both 3
route_map:
- name: qq
filter: in
state: present
state: present
state: present
- type: ipv6
remote_asn: 14
ip: 2001:4898:5808:ffa2::1
state: present
- type: ipv6
description: "U_site2-spine1-Auto Discovered peers"
auto_peer: unnumbered-auto
ebgp_peergroup: ebgp_pg
ebgp_peergroup_state: absent
ibgp_peergroup: ibgp_pg
ibgp_peergroup_state: present
sender_loop_detect: true
password: bgppassword
address_family:
- type: ipv4
activate: true
sender_loop_detect: true
state: present
allow_as_in: 5
next_hop_self: true
soft_reconf: true
- type: l2vpn
activate: true
sender_loop_detect: false
state: present
send_community:
- type: standard
state: present
admin: up
state: present
state: present
state: present
################################}
{% macro render_default_metric_configs(af_vars) %}
{% if af_vars.default_metric is defined %}
{% if af_vars.default_metric %}
default-metric {{ af_vars.default_metric }}
{% else %}
no default-metric
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_outbound_optimization_configs(out_opt_vars) %}
{% if out_opt_vars %}
outbound-optimization
{% else %}
outbound-optimization
{% endif %}
{% endmacro %}
{% macro render_non_deterministic_med_configs(non_deter_med_vars) %}
{% if non_deter_med_vars %}
non-deterministic-med
{% else %}
no non-deterministic-med
{% endif %}
{% endmacro %}
{% macro render_enforce_first_as_configs(enforce_first_as_vars) %}
{% if enforce_first_as_vars %}
enforce-first-as
{% else %}
no enforce-first-as
{% endif %}
{% endmacro %}
{% macro render_as_notation_configs(as_vars) %}
{% if as_vars %}
as-notation {{ as_vars }}
{% endif %}
{% endmacro %}
{% macro render_neigh_configs(neigh_vars,indent_space) %}
{% if neigh_vars is defined and neigh_vars %}
{% for neighbor in neigh_vars %}
{% if neighbor.type is defined %}
{% if neighbor.type == "ipv4" or neighbor.type =="ipv6" %}
{% if neighbor.ip is defined and neighbor.ip %}
{% set tag_or_ip = neighbor.ip %}
{% if neighbor.state is defined and neighbor.state == "absent" %}
{{ indent_space }}no neighbor {{ tag_or_ip }}
{% else %}
{{ indent_space }}neighbor {{ tag_or_ip }}
{% if neighbor.description is defined %}
{% if neighbor.description %}
{{ indent_space }}description "{{ neighbor.description }}"
{% else %}
{{ indent_space }}no description
{% endif %}
{% endif %}
{% if neighbor.peergroup is defined and neighbor.peergroup %}
{% if neighbor.peergroup_state is defined and neighbor.peergroup_state == "absent" %}
{{ indent_space }}no inherit template {{ neighbor.peergroup }}
{% else %}
{{ indent_space }}inherit template {{ neighbor.peergroup }}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% if neighbor.interface is defined and neighbor.interface %}
{% set tag_or_ip = neighbor.interface %}
{% if neighbor.state is defined and neighbor.state == "absent" %}
{{ indent_space }}no neighbor interface {{ neighbor.interface }}
{% else %}
{{ indent_space }}neighbor interface {{ neighbor.interface }}
{% if neighbor.description is defined %}
{% if neighbor.description %}
{{ indent_space }}description "{{ neighbor.description }}"
{% else %}
{{ indent_space }}no description
{% endif %}
{% endif %}
{% if neighbor.admin is defined %}
{% if neighbor.admin == "up" %}
{{ indent_space }}no shutdown
{% else %}
{{ indent_space }}shutdown
{% endif %}
{% endif %}
{% if neighbor.peergroup is defined and neighbor.peergroup %}
{% if neighbor.peergroup_state is defined and neighbor.peergroup_state == "absent" %}
{{ indent_space }}no inherit template {{ neighbor.peergroup }}
{% elif neighbor.peergroup_type is defined %}
{{ indent_space }}inherit template {{ neighbor.peergroup }} inherit-type {{ neighbor.peergroup_type }}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% if neighbor.auto_peer is defined and neighbor.auto_peer %}
{% set tag_or_ip = neighbor.auto_peer %}
{% if neighbor.state is defined and neighbor.state == "absent" %}
{{ indent_space }}no neighbor {{ neighbor.auto_peer }}
{% else %}
{{ indent_space }}neighbor {{ neighbor.auto_peer }}
{% if neighbor.description is defined %}
{% if neighbor.description %}
{{ indent_space }}description "{{ neighbor.description }}"
{% else %}
{{ indent_space }}no description
{% endif %}
{% endif %}
{% if neighbor.admin is defined %}
{% if neighbor.admin == "up" %}
{{ indent_space }}no shutdown
{% else %}
{{ indent_space }}shutdown
{% endif %}
{% endif %}
{% if neighbor.ebgp_peergroup is defined and neighbor.ebgp_peergroup %}
{% if neighbor.ebgp_peergroup_state is defined and neighbor.ebgp_peergroup_state == "absent" %}
{{ indent_space }}no inherit ebgp-template {{ neighbor.ebgp_peergroup }}
{% else %}
{{ indent_space }}inherit ebgp-template {{ neighbor.ebgp_peergroup }}
{% endif %}
{% endif %}
{% if neighbor.ibgp_peergroup is defined and neighbor.ibgp_peergroup %}
{% if neighbor.ibgp_peergroup_state is defined and neighbor.ibgp_peergroup_state == "absent" %}
{{ indent_space }}no inherit ibgp-template {{ neighbor.ibgp_peergroup }}
{% else %}
{{ indent_space }}inherit ibgp-template {{ neighbor.ibgp_peergroup }}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% elif neighbor.type == "peergroup" %}
{% if neighbor.name is defined and neighbor.name %}
{% set tag_or_ip = neighbor.name %}
{% if neighbor.state is defined and neighbor.state == "absent" %}
{{ indent_space }}no template {{ tag_or_ip }}
{% else %}
{{ indent_space }}template {{ tag_or_ip }}
{% if neighbor.description is defined %}
{% if neighbor.description %}
{{ indent_space }}description "{{ neighbor.description }}"
{% else %}
{{ indent_space }}no description
{% endif %}
{% endif %}
{% if neighbor.listen is defined and neighbor.listen %}
{% for item in neighbor.listen %}
{% if item.subnet is defined and item.subnet %}
{% if item.subnet_state is defined and item.subnet_state =="absent" %}
{{ indent_space }}no listen {{ item.subnet }}
{% else %}
{% set listen_str = item.subnet %}
{% if item.limit is defined and item.limit %}
{% set listen_str = listen_str ~ " limit " ~ item.limit %}
{% endif %}
{{ indent_space }}listen {{ listen_str }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% if tag_or_ip is defined and tag_or_ip %}
{% if (neighbor.state is defined and not neighbor.state == "absent" ) or neighbor.state is not defined %}
{% if neighbor.remote_asn is defined and neighbor.remote_asn %}
{% if neighbor.remote_asn_state is defined and neighbor.remote_asn_state == "absent" %}
{{ indent_space }}no remote-as {{ neighbor.remote_asn }}
{% else %}
{{ indent_space }}remote-as {{ neighbor.remote_asn }}
{% endif %}
{% endif %}
{% if neighbor.local_as is defined %}
{% if neighbor.local_as %}
{{ indent_space }}local-as {{ neighbor.local_as }}
{% else %}
{{ indent_space }}no local-as
{% endif %}
{% endif %}
{% if neighbor.weight is defined %}
{% if neighbor.weight %}
{{ indent_space }}weight {{ neighbor.weight }}
{% else %}
{{ indent_space }}no weight
{% endif %}
{% endif %}
{% if neighbor.src_loopback is defined %}
{% if neighbor.src_loopback|int(-1) != -1 %}
{{ indent_space }}update-source loopback{{ neighbor.src_loopback }}
{% else %}
{{ indent_space }}no update-source loopback
{% endif %}
{% endif %}
{% if neighbor.ebgp_multihop is defined %}
{% if neighbor.ebgp_multihop %}
{{ indent_space }}ebgp-multihop {{ neighbor.ebgp_multihop }}
{% else %}
{{ indent_space }}no ebgp-multihop
{% endif %}
{% endif %}
{% if neighbor.route_reflector_client is defined %}
{% if neighbor.route_reflector_client %}
{{ indent_space }}route-reflector-client
{% else %}
{{ indent_space }}no route-reflector-client
{% endif %}
{% endif %}
{% if neighbor.password is defined %}
{% if neighbor.password %}
{{ indent_space }}password {{ neighbor.password }}
{% else %}
{{ indent_space }}no password a
{% endif %}
{% endif %}
{% if neighbor.send_community is defined and neighbor.send_community %}
{% for comm in neighbor.send_community %}
{% if comm.type is defined and comm.type %}
{% if comm.state is defined and comm.state == "absent" %}
{{ indent_space }}no send-community {{ comm.type }}
{% else %}
{{ indent_space }}send-community {{ comm.type }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% if neighbor.address_family is defined and neighbor.address_family %}
{% for af in neighbor.address_family %}
{% if af.type is defined and af.type %}
{% if af.state is defined and af.state == "absent" %}
{% if af.type == "l2vpn" %}
{{ indent_space }}no address-family {{ af.type }} evpn
{% else %}
{{ indent_space }}no address-family {{ af.type }} unicast
{% endif %}
{% else %}
{% if af.type == "l2vpn" %}
{{ indent_space }}address-family {{ af.type }} evpn
{% else %}
{{ indent_space }}address-family {{ af.type }} unicast
{% endif %}
{% if af.activate is defined %}
{% if af.activate %}
{{ indent_space }}activate
{% else %}
{{ indent_space }}no activate
{% endif %}
{% endif %}
{% if af.sender_loop_detect is defined %}
{% if af.sender_loop_detect %}
{{ indent_space }}sender-side-loop-detection
{% else %}
{{ indent_space }}no sender-side-loop-detection
{% endif %}
{% endif %}
{% if af.allow_as_in is defined %}
{% if af.allow_as_in %}
{{ indent_space }}allowas-in {{ af.allow_as_in }}
{% else %}
{{ indent_space }}no allowas-in
{% endif %}
{% endif %}
{% if af.route_map is defined and af.route_map %}
{% for item in af.route_map %}
{% if item.name is defined and item.name %}
{% if item.filter is defined and item.filter %}
{% if item.state is defined and item.state == "absent" %}
{{ indent_space }}no route-map {{ item.name }} {{ item.filter }}
{% else %}
{{ indent_space }}route-map {{ item.name }} {{ item.filter }}
{% endif%}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% if af.next_hop_self is defined %}
{% if af.next_hop_self %}
{{ indent_space }}next-hop-self
{% else %}
{{ indent_space }}no next-hop-self
{% endif %}
{% endif %}
{% if af.soft_reconf is defined %}
{% if af.soft_reconf %}
{{ indent_space }}soft-reconfiguration inbound
{% else %}
{{ indent_space }}no soft-reconfiguration inbound
{% endif %}
{% endif %}
{% if af.add_path is defined %}
{% if af.add_path %}
{{ indent_space }}add-path {{ af.add_path }}
{% else %}
{{ indent_space }}no add-path
{% endif %}
{% endif %}
{% if af.max_prefix is defined %}
{% if af.max_prefix.count is defined and af.max_prefix.count %}
{% if af.max_prefix.state is defined and af.max_prefix.state == "absent" %}
{{ indent_space }}no maximum-prefix {{ af.max_prefix.count }}
{% else %}
{% set max_pfrx_str = af.max_prefix.count %}
{% if af.max_prefix.threshold is defined and af.max_prefix.threshold %}
{% set max_pfrx_str = max_pfrx_str ~ " " ~ af.max_prefix.threshold %}
{% endif %}
{% if af.max_prefix.warning is defined and af.max_prefix.warning %}
{% set max_pfrx_str = max_pfrx_str ~ " warning-only" %}
{% endif %}
{{ indent_space }}maximum-prefix {{ max_pfrx_str }}
{% endif %}
{% endif %}
{% endif %}
{% if af.default_originate is defined %}
{% if af.default_originate.state is defined and af.default_originate.state == "absent" %}
{{ indent_space }}no default-originate
{% else %}
{% set def_origin_str = " " %}
{% if af.default_originate.route_map is defined and af.default_originate.route_map %}
{% set def_origin_str = "route-map " ~ af.default_originate.route_map %}
{% endif %}
{{ indent_space }}default-originate {{ def_origin_str }}
{% endif %}
{% endif %}
{% if af.distribute_list is defined and af.distribute_list %}
{% if af.distribute_list.in is defined and af.distribute_list.in %}
{% if af.distribute_list.in_state is defined and af.distribute_list.in_state == "absent" %}
{{ indent_space }}no distribute-list {{ af.distribute_list.in }} in
{% else %}
{{ indent_space }}distribute-list {{ af.distribute_list.in }} in
{% endif %}
{% endif %}
{% if af.distribute_list.out is defined and af.distribute_list.out %}
{% if af.distribute_list.out_state is defined and af.distribute_list.out_state == "absent" %}
{{ indent_space }}no distribute-list {{ af.distribute_list.out }} out
{% else %}
{{ indent_space }}distribute-list {{ af.distribute_list.out }} out
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% if neighbor.adv_interval is defined %}
{% if neighbor.adv_interval %}
{{ indent_space }}advertisement-interval {{ neighbor.adv_interval }}
{% else %}
{{ indent_space }}no advertisement-interval
{% endif %}
{% endif %}
{% if neighbor.adv_start is defined and neighbor.adv_start >= 0 %}
{% if neighbor.adv_start_state is defined and neighbor.adv_start_state == "absent" %}
{{ indent_space }}no advertisement-start
{% else %}
{{ indent_space }}advertisement-start {{ neighbor.adv_start }}
{% endif %}
{% endif %}
{% if neighbor.conn_retry_timer is defined %}
{% if neighbor.conn_retry_timer %}
{{ indent_space }}connection-retry-timer {{ neighbor.conn_retry_timer }}
{% else %}
{{ indent_space }}no connection-retry-timer
{% endif %}
{% endif %}
{% if neighbor.remove_pri_as is defined and neighbor.remove_pri_as == "present" %}
{{ indent_space }}remove-private-as
{% elif neighbor.remove_pri_as is defined and neighbor.remove_pri_as == "absent" %}
{{ indent_space }}no remove-private-as
{% endif %}
{% if neighbor.fall_over is defined and neighbor.fall_over == "present" %}
{{ indent_space }}fall-over
{% elif neighbor.fall_over is defined and neighbor.fall_over == "absent" %}
{{ indent_space }}no fall-over
{% endif %}
{% if neighbor.bfd is defined and neighbor.bfd %}
{{ indent_space }}bfd
{% elif neighbor.bfd is defined and not neighbor.bfd %}
{{ indent_space }}no bfd
{% endif %}
{% if neighbor.timer is defined %}
{% if neighbor.timer %}
{{ indent_space }}timers {{ neighbor.timer }}
{% else %}
{{ indent_space }}no timers
{% endif %}
{% endif %}
{% if neighbor.admin is defined %}
{% if neighbor.admin == "up" %}
{{ indent_space }}no shutdown
{% else %}
{{ indent_space }}shutdown
{% endif %}
{% endif %}
{% if neighbor.distribute_list is defined and neighbor.distribute_list %}
{{ indent_space }}address-family ipv4 unicast
{% if neighbor.distribute_list.in is defined and neighbor.distribute_list.in %}
{% if neighbor.distribute_list.in_state is defined and neighbor.distribute_list.in_state == "absent" %}
{{ indent_space }}no distribute-list {{ neighbor.distribute_list.in }} in
{% else %}
{{ indent_space }}distribute-list {{ neighbor.distribute_list.in }} in
{% endif %}
{% endif %}
{% if neighbor.distribute_list.out is defined and neighbor.distribute_list.out %}
{% if neighbor.distribute_list.out_state is defined and neighbor.distribute_list.out_state == "absent" %}
{{ indent_space }}no distribute-list {{ neighbor.distribute_list.out }} out
{% else %}
{{ indent_space }}distribute-list {{ neighbor.distribute_list.out }} out
{% endif %}
{% endif %}
{% endif %}
{% if neighbor.sender_loop_detect is defined %}
{{ indent_space }}address-family ipv4 unicast
{% if neighbor.sender_loop_detect %}
{{ indent_space }}sender-side-loop-detection
{% else %}
{{ indent_space }}no sender-side-loop-detection
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endmacro %}
{% macro render_ibgp_redist_internal_configs(af_vars) %}
{% if af_vars.ibgp_redist_internal is defined and af_vars.ibgp_redist_internal%}
{% if af_vars.ibgp_redist_internal.state is defined and af_vars.ibgp_redist_internal.state == "absent" %}
no bgp redistribute-internal
{% else %}
bgp redistribute-internal
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_distance_bgp_configs(af_vars) %}
{% if af_vars.distance_bgp is defined and af_vars.distance_bgp %}
{% if af_vars.distance_bgp.state is defined and af_vars.distance_bgp.state == "absent" %}
no distance bgp
{% else %}
{% if af_vars.distance_bgp.value is defined and af_vars.distance_bgp.value %}
distance bgp {{ af_vars.distance_bgp.value }}
{% endif %}
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_dampening_configs(af_vars) %}
{% if af_vars.dampening is defined and af_vars.dampening %}
{% if af_vars.dampening.state is defined and af_vars.dampening.state == "absent" %}
no dampening
{% else %}
{% if af_vars.dampening.value is defined and af_vars.dampening.value %}
{% if af_vars.dampening.route_map is defined and af_vars.dampening.route_map %}
dampening {{ af_vars.dampening.value }} route-map {{ af_vars.dampening.route_map }}
{% else %}
dampening {{ af_vars.dampening.value }}
{% endif %}
{% else %}
{% if af_vars.dampening.route_map is defined and af_vars.dampening.route_map %}
dampening 15 750 2000 60 route-map {{ af_vars.dampening.route_map }}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_af_configs(af_vars) %}
{% if af_vars is defined and af_vars %}
{% if af_vars.aggregate_address is defined and af_vars.aggregate_address %}
{% for addr in af_vars.aggregate_address %}
{% if addr.ip_and_mask is defined and addr.ip_and_mask %}
{% if addr.state is defined and addr.state == "absent" %}
no aggregate-address {{ addr.ip_and_mask }}
{% else %}
{% set aggr_str = addr.ip_and_mask %}
{% if addr.adv_map is defined and addr.adv_map %}
{% set aggr_str = aggr_str ~ " advertise-map " ~ addr.adv_map %}
{% endif %}
{% if addr.as_set is defined and addr.as_set %}
{% set aggr_str = aggr_str ~ " as-set " %}
{% endif %}
{% if addr.attr_map is defined and addr.attr_map %}
{% set aggr_str = aggr_str ~ " attribute-map " ~ addr.attr_map %}
{% endif %}
{% if addr.summary is defined and addr.summary %}
{% set aggr_str = aggr_str ~ " summary-only" %}
{% endif %}
{% if addr.suppress_map is defined and addr.suppress_map %}
{% set aggr_str = aggr_str ~ " suppress-map " ~ addr.suppress_map %}
{% endif %}
aggregate-address {{ aggr_str }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_rtid_configs(routerid_vars) %}
{% if routerid_vars %}
router-id {{ routerid_vars }}
{% else %}
no router-id
{% endif %}
{% endmacro %}
{% macro render_bfd_all_neigh_configs(bfd_all_neigh_vars) %}
{% if bfd_all_neigh_vars.state is defined and bfd_all_neigh_vars.state == "absent"%}
no bfd all-neighbors
{% else %}
{% set bfd_vars = bfd_all_neigh_vars %}
{% if bfd_vars.interval is defined and bfd_vars.min_rx is defined and bfd_vars.multiplier is defined %}
bfd all-neighbors interval {{ bfd_vars.interval }} min_rx {{ bfd_vars.min_rx }} multiplier {{ bfd_vars.multiplier }} role {{ bfd_vars.role }}
{% else %}
bfd all-neighbors
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_log_neigh_change_configs(log_neigh_change_vars) %}
{% if log_neigh_change_vars %}
log-neighbor-changes
{% else %}
no log-neighbor-changes
{% endif %}
{% endmacro %}
{% macro render_maxpath_ebgp_configs(maxpath_ebgp_vars) %}
{% if maxpath_ebgp_vars %}
maximum-paths ebgp {{ maxpath_ebgp_vars }}
{% else %}
no maximum-paths ebgp
{% endif %}
{% endmacro %}
{% macro render_maxpath_ibgp_configs(maxpath_ibgp_vars) %}
{% if maxpath_ibgp_vars %}
maximum-paths ibgp {{ maxpath_ibgp_vars }}
{% else %}
no maximum-paths ibgp
{% endif %}
{% endmacro %}
{% macro render_graceful_restart_configs(graceful_restart_vars) %}
{% if graceful_restart_vars %}
graceful-restart role receiver-only
{% else %}
no graceful-restart role receiver-only
{% endif %}
{% endmacro %}
{% macro render_always_compare_med_configs(always_compare_med_vars) %}
{% if always_compare_med_vars %}
always-compare-med
{% else %}
no always-compare-med
{% endif %}
{% endmacro %}
{% macro render_default_loc_pref_configs(default_loc_pref_vars) %}
{% if default_loc_pref_vars %}
default local-preference {{ default_loc_pref_vars }}
{% else %}
no default local-preference
{% endif %}
{% endmacro %}
{% macro render_fast_ext_fallover_configs(fast_ext_fallover_vars) %}
{% if fast_ext_fallover_vars %}
fast-external-fallover
{% else %}
no fast-external-fallover
{% endif %}
{% endmacro %}
{% macro render_confederation_configs(confederation_vars) %}
{% if confederation_vars.identifier is defined %}
{% if confederation_vars.identifier %}
confederation identifier {{ confederation_vars.identifier }}
{% else %}
no confederation identifier 1
{% endif %}
{% endif %}
{% if confederation_vars.peers is defined and confederation_vars.peers %}
{% if confederation_vars.peers_state is defined and confederation_vars.peers_state == "absent" %}
no confederation peers {{ confederation_vars.peers }}
{% else %}
confederation peers {{ confederation_vars.peers }}
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_route_reflector_client_configs(route_reflector_vars) %}
{% if route_reflector_vars.client_to_client is defined %}
{% if route_reflector_vars.client_to_client %}
client-to-client reflection
{% else %}
no client-to-client reflection
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_route_reflector_cluster_configs(route_reflector_vars) %}
{% if route_reflector_vars.cluster_id is defined %}
{% if route_reflector_vars.cluster_id %}
cluster-id {{ route_reflector_vars.cluster_id }}
{% else %}
no cluster-id 1
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_best_path_as_configs(best_path_vars) %}
{% if best_path_vars.as_path is defined and best_path_vars.as_path %}
{% if best_path_vars.as_path_state is defined and best_path_vars.as_path_state == "absent" %}
no bestpath as-path {{ best_path_vars.as_path }}
{% else %}
bestpath as-path {{ best_path_vars.as_path }}
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_best_path_routerid_configs(best_path_vars) %}
{% if best_path_vars.ignore_router_id is defined %}
{% if best_path_vars.ignore_router_id %}
bestpath router-id ignore
{% else %}
no bestpath router-id ignore
{% endif %}
{% endif %}
{% endmacro %}
{% macro render_best_path_med_configs(best_path_vars,indent_space) %}
{% if best_path_vars.med is defined and best_path_vars.med %}
{% for med in best_path_vars.med %}
{% if med.attribute is defined and med.attribute %}
{% if med.state is defined and med.state == "absent" %}
{{ indent_space }}no bestpath med {{ med.attribute }}
{% else %}
{{ indent_space }}bestpath med {{ med.attribute }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endmacro %}
{% macro render_ipv4_network_configs(ipv4_network_vars) %}
{% for net in ipv4_network_vars %}
{% if net.address is defined and net.address %}
{% if net.state is defined and net.state == "absent"%}
no network {{ net.address }}
{% else %}
network {{ net.address }}
{% endif %}
{% endif %}
{% endfor %}
{% endmacro %}
{% macro render_ipv6_network_configs(ipv6_network_vars) %}
{% for net in ipv6_network_vars %}
{% if net.address is defined and net.address %}
{% if net.state is defined and net.state == "absent"%}
no network {{ net.address }}
{% else %}
network {{ net.address }}
{% endif %}
{% endif %}
{% endfor %}
{% endmacro %}
{% macro render_redistribute_configs(redistribute_vars,indent_space) %}
{% for route in redistribute_vars %}
{% if route.route_type is defined and route.route_type %}
{% if route.address_type is defined and route.address_type %}
{{ indent_space }}address-family {{ route.address_type }} unicast
{% if route.state is defined and route.state == "absent" %}
{% if route.route_type == "imported_bgp" %}
{% set redist_str = "imported-bgp-routes vrf " ~ route.imported_bgp_vrf_name %}
{% elif route.route_type == "ospf" and route.ospf_id %}
{% set redist_str = route.route_type ~ " " ~ route.ospf_id %}
{% elif route.route_type == "l2vpn" %}
{% set redist_str = route.route_type ~ " evpn" %}
{% else %}
{% set redist_str = route.route_type %}
{% endif %}
{{ indent_space }}no redistribute {{ redist_str }}
{% else %}
{% if route.route_map_name is defined and route.route_map_name %}
{% if route.route_type == "imported_bgp" %}
{% set redist_str = "imported-bgp-routes vrf " ~ route.imported_bgp_vrf_name ~ " route-map " ~ route.route_map_name %}
{% elif route.route_type == "ospf" and route.ospf_id %}
{% set redist_str = route.route_type ~ " " ~ route.ospf_id ~ " route-map " ~ route.route_map_name %}
{% elif route.route_type == "l2vpn" %}
{% set redist_str = route.route_type ~ " evpn route-map " ~ route.route_map_name %}
{% else %}
{% set redist_str = route.route_type ~ " route-map " ~ route.route_map_name %}
{% endif %}
{{ indent_space }}redistribute {{ redist_str }}
{% else %}
{% if route.route_type == "imported_bgp" %}
{% set redist_str = "imported-bgp-routes vrf " ~ route.imported_bgp_vrf_name %}
{% elif route.route_type == "ospf" and route.ospf_id %}
{% set redist_str = route.route_type ~ " " ~ route.ospf_id %}
{% elif route.route_type == "l2vpn" %}
{% set redist_str = route.route_type ~ " evpn" %}
{% else %}
{% set redist_str = route.route_type %}
{% endif %}
{{ indent_space }}redistribute {{ redist_str }}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% endmacro %}
{% if os10_bgp is defined and os10_bgp %}
{% set bgp_vars = os10_bgp %}
{% if bgp_vars.state is defined and bgp_vars.state == "absent" %}
no router bgp
{% else %}
{# Add Feature to the switch #}
{% if bgp_vars.asn is defined and bgp_vars.asn %}
router bgp {{ bgp_vars.asn }}
{% set indent_space = "" %}
{% if bgp_vars.router_id is defined %}
{% set routerid_vars = bgp_vars.router_id %}
{{ render_rtid_configs(routerid_vars) }}
{% endif %}
{% if bgp_vars.as_notation is defined %}
{% set as_vars = bgp_vars.as_notation %}
{{ render_as_notation_configs(as_vars) }}
{% endif %}
{% if bgp_vars.enforce_first_as is defined %}
{% set enforce_first_as_vars = bgp_vars.enforce_first_as %}
{{ render_enforce_first_as_configs(enforce_first_as_vars) }}
{% endif %}
{% if bgp_vars.non_deterministic_med is defined %}
{% set non_deter_med_vars = bgp_vars.non_deterministic_med %}
{{ render_non_deterministic_med_configs(non_deter_med_vars) }}
{% endif %}
{% if bgp_vars.outbound_optimization is defined %}
{% set out_opt_vars = bgp_vars.outbound_optimization %}
{{ render_outbound_optimization_configs(out_opt_vars) }}
{% endif %}
{% if bgp_vars.bfd_all_neighbors is defined and bgp_vars.bfd_all_neighbors is defined %}
{% set bfd_all_neigh_vars = bgp_vars.bfd_all_neighbors %}
{{ render_bfd_all_neigh_configs(bfd_all_neigh_vars) }}
{% endif %}
{% if bgp_vars.log_neighbor_changes is defined %}
{% set log_neigh_change_vars = bgp_vars.log_neighbor_changes %}
{{ render_log_neigh_change_configs(log_neigh_change_vars) }}
{% endif %}
{% if bgp_vars.maxpath_ebgp is defined %}
{% set maxpath_ebgp_vars = bgp_vars.maxpath_ebgp %}
{{ render_maxpath_ebgp_configs(maxpath_ebgp_vars) }}
{% endif %}
{% if bgp_vars.maxpath_ibgp is defined %}
{% set maxpath_ibgp_vars = bgp_vars.maxpath_ibgp %}
{{ render_maxpath_ibgp_configs(maxpath_ibgp_vars) }}
{% endif %}
{% if bgp_vars.graceful_restart is defined %}
{% set graceful_restart_vars = bgp_vars.graceful_restart %}
{{ render_graceful_restart_configs(graceful_restart_vars) }}
{% endif %}
{% if bgp_vars.always_compare_med is defined %}
{% set always_compare_med_vars = bgp_vars.always_compare_med %}
{{ render_always_compare_med_configs(always_compare_med_vars) }}
{% endif %}
{% if bgp_vars.default_loc_pref is defined %}
{% set default_loc_pref_vars = bgp_vars.default_loc_pref %}
{{ render_default_loc_pref_configs(default_loc_pref_vars) }}
{% endif %}
{% if bgp_vars.fast_ext_fallover is defined %}
{% set fast_ext_fallover_vars = bgp_vars.fast_ext_fallover %}
{{ render_fast_ext_fallover_configs(fast_ext_fallover_vars) }}
{% endif %}
{% if bgp_vars.confederation is defined and bgp_vars.confederation %}
{% set confederation_vars = bgp_vars.confederation %}
{{ render_confederation_configs(confederation_vars) }}
{% endif %}
{% if bgp_vars.route_reflector is defined and bgp_vars.route_reflector %}
{% set route_reflector_vars = bgp_vars.route_reflector %}
{{ render_route_reflector_client_configs(route_reflector_vars) }}
{{ render_route_reflector_cluster_configs(route_reflector_vars) }}
{% endif %}
{% if bgp_vars.best_path is defined and bgp_vars.best_path %}
{% set best_path_vars = bgp_vars.best_path %}
{{ render_best_path_as_configs(best_path_vars) }}
{{ render_best_path_routerid_configs(best_path_vars) }}
{{ render_best_path_med_configs(best_path_vars,indent_space) }}
{% endif %}
{% if bgp_vars.address_family_ipv4 is defined and bgp_vars.address_family_ipv4 %}
{% set af_vars = bgp_vars.address_family_ipv4 %}
address-family ipv4 unicast
{{ render_af_configs(af_vars) }}
{{ render_ibgp_redist_internal_configs(af_vars) }}
{{ render_dampening_configs(af_vars) }}
{{ render_default_metric_configs(af_vars) }}
{{ render_distance_bgp_configs(af_vars) }}
{% endif %}
{% if bgp_vars.address_family_ipv6 is defined and bgp_vars.address_family_ipv6 %}
{% set af_vars = bgp_vars.address_family_ipv6 %}
address-family ipv6 unicast
{{ render_af_configs(af_vars) }}
{{ render_ibgp_redist_internal_configs(af_vars) }}
{{ render_dampening_configs(af_vars) }}
{{ render_default_metric_configs(af_vars) }}
{{ render_distance_bgp_configs(af_vars) }}
{% endif %}
{% if bgp_vars.ipv4_network is defined and bgp_vars.ipv4_network %}
{% set ipv4_network_vars = bgp_vars.ipv4_network %}
address-family ipv4 unicast
{{ render_ipv4_network_configs(ipv4_network_vars) }}
{% endif %}
{% if bgp_vars.ipv6_network is defined and bgp_vars.ipv6_network %}
{% set ipv6_network_vars = bgp_vars.ipv6_network %}
address-family ipv6 unicast
{{ render_ipv6_network_configs(ipv6_network_vars) }}
{% endif %}
{% if bgp_vars.redistribute is defined and bgp_vars.redistribute %}
{% set redistribute_vars = bgp_vars.redistribute %}
{{ render_redistribute_configs(redistribute_vars,indent_space) }}
{% endif %}
{% if bgp_vars.neighbor is defined and bgp_vars.neighbor %}
{% set neigh_vars = bgp_vars.neighbor %}
{{ render_neigh_configs(neigh_vars,indent_space) }}
{% endif %}
{% if bgp_vars.vrfs is defined %}
{% set indent_space = " " %}
{% for vrf in bgp_vars.vrfs %}
{% if vrf.state is defined and vrf.state == "absent" %}
no vrf {{ vrf.name }}
{% else %}
vrf {{ vrf.name }}
{% if vrf.router_id is defined %}
{% set routerid_vars = vrf.router_id %}
{{ render_rtid_configs(routerid_vars) }}
{% endif %}
{% if vrf.as_notation is defined %}
{% set as_vars = vrf.as_notation %}
{{ render_as_notation_configs(as_vars) }}
{% endif %}
{% if vrf.enforce_first_as is defined %}
{% set enforce_first_as_vars = vrf.enforce_first_as %}
{{ render_enforce_first_as_configs(enforce_first_as_vars) }}
{% endif %}
{% if vrf.non_deterministic_med is defined %}
{% set non_deter_med_vars = vrf.non_deterministic_med %}
{{ render_non_deterministic_med_configs(non_deter_med_vars) }}
{% endif %}
{% if vrf.outbound_optimization is defined %}
{% set out_opt_vars = vrf.outbound_optimization %}
{{ render_outbound_optimization_configs(out_opt_vars) }}
{% endif %}
{% if vrf.bfd_all_neighbors is defined and vrf.bfd_all_neighbors is defined %}
{% set bfd_all_neigh_vars = vrf.bfd_all_neighbors %}
{{ render_bfd_all_neigh_configs(bfd_all_neigh_vars) }}
{% endif %}
{% if vrf.log_neighbor_changes is defined %}
{% set log_neigh_change_vars = vrf.log_neighbor_changes %}
{{ render_log_neigh_change_configs(log_neigh_change_vars) }}
{% endif %}
{% if vrf.maxpath_ebgp is defined %}
{% set maxpath_ebgp_vars = vrf.maxpath_ebgp %}
{{ render_maxpath_ebgp_configs(maxpath_ebgp_vars) }}
{% endif %}
{% if vrf.maxpath_ibgp is defined %}
{% set maxpath_ibgp_vars = vrf.maxpath_ibgp %}
{{ render_maxpath_ibgp_configs(maxpath_ibgp_vars) }}
{% endif %}
{% if vrf.graceful_restart is defined %}
{% set graceful_restart_vars = vrf.graceful_restart %}
{{ render_graceful_restart_configs(graceful_restart_vars) }}
{% endif %}
{% if vrf.always_compare_med is defined %}
{% set always_compare_med_vars = vrf.always_compare_med %}
{{ render_always_compare_med_configs(always_compare_med_vars) }}
{% endif %}
{% if vrf.default_loc_pref is defined %}
{% set default_loc_pref_vars = vrf.default_loc_pref %}
{{ render_default_loc_pref_configs(default_loc_pref_vars) }}
{% endif %}
{% if vrf.fast_ext_fallover is defined %}
{% set fast_ext_fallover_vars = vrf.fast_ext_fallover %}
{{ render_fast_ext_fallover_configs(fast_ext_fallover_vars) }}
{% endif %}
{% if vrf.route_reflector is defined and vrf.route_reflector %}
{% set route_reflector_vars = vrf.route_reflector %}
{{ render_route_reflector_client_configs(route_reflector_vars) }}
{{ render_route_reflector_cluster_configs(route_reflector_vars) }}
{% endif %}
{% if vrf.best_path is defined and vrf.best_path %}
{% set best_path_vars = vrf.best_path %}
{{ render_best_path_as_configs(best_path_vars) }}
{{ render_best_path_routerid_configs(best_path_vars) }}
{{ render_best_path_med_configs(best_path_vars,indent_space) }}
{% endif %}
{% if vrf.address_family_ipv4 is defined and vrf.address_family_ipv4 %}
{% set af_vars = vrf.address_family_ipv4 %}
address-family ipv4 unicast
{{ render_af_configs(af_vars) }}
{{ render_dampening_configs(af_vars) }}
{{ render_ibgp_redist_internal_configs(af_vars) }}
{{ render_default_metric_configs(af_vars) }}
{{ render_distance_bgp_configs(af_vars) }}
{% endif %}
{% if vrf.address_family_ipv6 is defined and vrf.address_family_ipv6 %}
{% set af_vars = vrf.address_family_ipv6 %}
address-family ipv6 unicast
{{ render_af_configs(af_vars) }}
{{ render_dampening_configs(af_vars) }}
{{ render_ibgp_redist_internal_configs(af_vars) }}
{{ render_default_metric_configs(af_vars) }}
{{ render_distance_bgp_configs(af_vars) }}
{% endif %}
{% if vrf.ipv4_network is defined and vrf.ipv4_network %}
{% set ipv4_network_vars = vrf.ipv4_network %}
address-family ipv4 unicast
{{ render_ipv4_network_configs(ipv4_network_vars) }}
{% endif %}
{% if vrf.ipv6_network is defined and vrf.ipv6_network %}
{% set ipv6_network_vars = vrf.ipv6_network %}
address-family ipv6 unicast
{{ render_ipv6_network_configs(ipv6_network_vars) }}
{% endif %}
{% if vrf.redistribute is defined and vrf.redistribute %}
{% set redistribute_vars = vrf.redistribute %}
{{ render_redistribute_configs(redistribute_vars,indent_space) }}
{% endif %}
{% if vrf.neighbor is defined and vrf.neighbor %}
{% set neigh_vars = vrf.neighbor %}
{{ render_neigh_configs(neigh_vars,indent_space) }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}