# 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 {{ fabric_gateway_hwaddr }}
  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('linux') }}
  bond-miimon 100
  bond-slaves none
  bond-mode active-backup
  post-down ip link del fabricbond
{% endif %}

{% endfor %}

