# Created by platform-install: interface-config/templates/fabric.cfg.j2
{% for node in physical_node_list if node.name == ansible_hostname %}

# fabricbridge between physical bond and virtual interfaces for VTN
auto fabricbridge
iface fabricbridge inet manual
  pre-up ip link add fabricbridge type bridge
  bridge_ports fabricbond vethfabric0

# fabric bond of physical interfaces for VTN
auto fabricbond
iface fabricbond inet manual
  pre-up ip link add fabricbond type bond
  pre-up ip link set fabricbond up
  bond-miimon 100
  bond-slaves none
  bond-mode active-backup
  post-down ip link del fabricbond

{% if fabric_net_interfaces %}
# physical network members of fabricbond
{% for fab_int in fabric_net_interfaces %}
auto {{ fab_int }}
iface {{ fab_int }} inet manual
  pre-up ip link set {{ mgmt_int }} master fabricbond
  bond-master fabricbond
  bond-mode active-backup
  bond-primary {{ management_net_interfaces | join(' ') }}
  post-down ip link set dev {{ mgmt_int }} nomaster

{% endfor %}
{% endif %}

# vethfabric0/vethfabric1 interfaces connect from VTN br-int to fabricbridge
# vethfabric0: connected to fabricbridge
auto vethfabric0
iface vethfabric0 inet manual
  pre-up ip link add vethfabric0 type veth peer name vethfabric1
  pre-up ip link set vethfabric0 up
  post-up ip link set dev vethfabric0 master fabricbridge
  pre-down ip link set dev vethfabric0 nomaster
  post-down ip link del vethfabric0

# vethfabric1: becomes a part of br-int, which takes over the IP address
{% set vtn_veth_ip = ( vtn_net_public_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto vethfabric1
iface vethfabric1 inet static
  address {{ vtn_veth_ip }}
  network {{ vtn_net_public_cidr | ipaddr('network') }}
  netmask {{ vtn_net_public_cidr | ipaddr('netmask') }}
  gateway {{ vtn_net_public_cidr | ipaddr('1') | ipaddr('address') }}
  broadcast {{ vtn_net_public_cidr | ipaddr('broadcast') }}
  hwaddress ether {{ ( vtn_net_public_hwaddr_prefix ~ ( vtn_veth_ip | ip4_hex )) | hwaddr('unix') }}

{% if use_addresspool_vsg %}
# vSG public gateway
{% set ap_vsg_veth_ip = ( addresspool_vsg_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto vethfabric1:0
iface vethfabric1:0 inet static
  address {{ ap_vsg_veth_ip }}
  network {{ addresspool_vsg_cidr | ipaddr('network') }}
  netmask {{ addresspool_vsg_cidr | ipaddr('netmask') }}
  gateway {{ addresspool_vsg_cidr | ipaddr('1') | ipaddr('address') }}
  broadcast {{ addresspool_vsg_cidr | ipaddr('broadcast') }}
  hwaddress ether {{ ( addresspool_vsg_hwaddr_prefix ~ ( ap_vsg_eth_ip | ip4_hex )) | hwaddr('unix') }}

{% endif %}

{% if use_addresspool_public %}
# public network gateway
{% set ap_pub_veth_ip = ( addresspool_public_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto vethfabric1:1
iface vethfabric1:1 inet static
  address {{ ap_pub_veth_ip }}
  network {{ addresspool_public_cidr | ipaddr('network') }}
  netmask {{ addresspool_public_cidr | ipaddr('netmask') }}
  gateway {{ addresspool_public_cidr | ipaddr('1') | ipaddr('address') }}
  broadcast {{ addresspool_public_cidr | ipaddr('broadcast') }}
  hwaddress ether {{ ( addresspool_public_hwaddr_prefix ~ ( ap_pub_veth_ip | ip4_hex )) | hwaddr('unix') }}

{% endif %}
{% endfor %}

