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

{% 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 {{ fab_int }} master fabricbond
  bond-master fabricbond
  bond-primary {{ fabric_net_interfaces | join(' ') }}
  post-down ip link set dev {{ fab_int }} nomaster

{% endfor %}
{% endif %}

{% if node.name == headnode %}
# fabricbond of physical interfaces on head node
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

# fabricbridge
{% set vtn_ip = ( vtn_net_public_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto fabricbridge
iface fabricbridge inet static
  pre-up ip link add fabricbridge type bridge
  bridge_ports fabricbond
  address {{ vtn_ip }}
  network {{ vtn_net_public_cidr | ipaddr('network') }}
  netmask {{ vtn_net_public_cidr | ipaddr('netmask') }}
  broadcast {{ vtn_net_public_cidr | ipaddr('broadcast') }}
  hwaddress ether {{ ( vtn_net_public_hwaddr_prefix ~ ( vtn_ip | ip4_hex )) | hwaddr('unix') }}
  post-down ip link del fabricbridge

{% if use_addresspool_vsg %}
# vSG public gateway
{% set ap_vsg_ip = ( addresspool_vsg_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto fabricbridge:0
iface fabricbridge:0 inet static
  address {{ ap_vsg_ip }}
  network {{ addresspool_vsg_cidr | ipaddr('network') }}
  netmask {{ addresspool_vsg_cidr | ipaddr('netmask') }}
  broadcast {{ addresspool_vsg_cidr | ipaddr('broadcast') }}
{% endif %}

{% if use_addresspool_public %}
# public network gateway
{% set ap_pub_ip = ( addresspool_public_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto fabricbridge:1
iface fabricbridge:1 inet static
  address {{ ap_pub_ip }}
  network {{ addresspool_public_cidr | ipaddr('network') }}
  netmask {{ addresspool_public_cidr | ipaddr('netmask') }}
  broadcast {{ addresspool_public_cidr | ipaddr('broadcast') }}
{% endif %}
{% else %}
# Compute nodes only have a fabricbond, which is put into br-int by VTN
{% set vtn_ip = ( vtn_net_public_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto fabricbond
iface fabricbond inet static
  pre-up ip link add fabricbond type bond
  pre-up ip link set fabricbond up
  address {{ vtn_ip }}
  network {{ vtn_net_public_cidr | ipaddr('network') }}
  netmask {{ vtn_net_public_cidr | ipaddr('netmask') }}
  broadcast {{ vtn_net_public_cidr | ipaddr('broadcast') }}
  hwaddress ether {{ ( vtn_net_public_hwaddr_prefix ~ ( vtn_ip | ip4_hex )) | hwaddr('unix') }}
  bond-miimon 100
  bond-slaves none
  bond-mode active-backup
  post-down ip link del fabricbond
{% endif %}

{% endfor %}

