# Generated by confd router id {{getenv "IP"}}; # Use IPv4 address since router id is 4 octets, even in MP-BGP # Watch interface up/down events. protocol device { scan time 2; # Scan interfaces every 2 seconds } {{if eq "" (getenv "IP6")}}# IPv6 disabled on this node. {{else}} # Template for all BGP clients template bgp bgp_template { debug off; description "Connection to BGP peer"; multihop; import all; # Import all routes, since we don't know what the upstream # topology is and therefore have to trust the ToR/RR. export all; # Export all. source address {{getenv "IP6"}}; # The local address we use for the TCP connection graceful restart; # See comment in kernel section about graceful restart. } {{$our_rr_key := printf "/rr_v6/%s" (getenv "IP6")}} {{if ls $our_rr_key}}{{$our_rr_data := json (getv $our_rr_key)}} # ------------- RR-to-RR full mesh ------------- {{if ls "/rr_v6"}} {{range gets "/rr_v6/*"}}{{$data := json .Value}}{{$rr_ip := $data.ip}} {{$nums := split $rr_ip ":"}}{{$id := join $nums "_"}} # For RR {{$rr_ip}} {{if eq $rr_ip (getenv "IP6") }}# Skipping ourselves {{else if ne "" $rr_ip}}protocol bgp Mesh_{{$id}} from bgp_template { local as {{getv "/global/as_num"}}; neighbor {{$rr_ip}} as {{getv "/global/as_num"}}; }{{end}}{{end}} {{end}} # ------------- RR as a global peer ------------- {{if ls "/global/peer_v6"}} {{range gets "/global/peer_v6/*"}}{{$data := json .Value}} {{if eq $data.ip (getenv "IP6")}} # This RR is a global peer with *all* calico nodes. {{range $cnode := lsdir "/host"}} {{$cnode_as_key := printf "/host/%s/as_num" $cnode}} {{$cnode_ip_key := printf "/host/%s/ip_addr_v6" $cnode}}{{$cnode_ip := getv $cnode_ip_key}} {{$nums := split $cnode_ip "."}}{{$id := join $nums "_"}} # Peering with Calico node {{$cnode}} protocol bgp Global_{{$id}} from bgp_template { local as {{$data.as_num}}; neighbor {{$cnode_ip}} as {{if exists $cnode_as_key}}{{getv $cnode_as_key}}{{else}}{{getv "/global/as_num"}}{{end}}; rr client; {{if $our_rr_data.cluster_id}}rr cluster id {{$our_rr_data.cluster_id}};{{end}} } {{end}} {{end}} {{end}} {{end}} # ------------- RR as a node-specific peer ------------- {{range $cnode := lsdir "/host"}} {{$node_peers_key := printf "/host/%s/peer_v6" $cnode}} {{if ls $node_peers_key}} {{range $peer := gets (printf "%s/*" $node_peers_key)}}{{$data := json $peer.Value}} {{if eq $data.ip (getenv "IP")}} {{$cnode_as_key := printf "/host/%s/as_num" $cnode}} {{$cnode_ip_key := printf "/host/%s/ip_addr_v6" $cnode}}{{$cnode_ip := getv $cnode_ip_key}} {{$nums := split $cnode_ip "."}}{{$id := join $nums "_"}} # RR configured as a specific peer for calico node {{$peer.Key}} protocol bgp Node_{{$id}} from bgp_template { local as {{$data.as_num}}; neighbor {{$cnode_ip}} as {{if exists $cnode_as_key}}{{getv $cnode_as_key}}{{else}}{{getv "/global/as_num"}}{{end}}; rr client; {{if $our_rr_data.cluster_id}}rr cluster id {{$our_rr_data.cluster_id}};{{end}} } {{end}} {{end}} {{end}} {{end}} {{end}} {{end}}