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

# management bridge between physical and virtual interfaces for VTN
{% set mgmtbridge_ip = ( vtn_net_management_host_cidr | ipaddr(node.ipv4_last_octet) | ipaddr('address')) %}
auto {{ management_net_bridge }}
iface {{ management_net_bridge }} inet static
  pre-up ip link add {{ management_net_bridge }} type bridge
  bridge_ports mgmtbond vethmgmt0
  address {{ mgmtbridge_ip }}
  network {{ vtn_net_management_host_cidr | ipaddr('network') }}
  netmask {{ vtn_net_management_host_cidr | ipaddr('netmask') }}
  broadcast {{ vtn_net_management_host_cidr | ipaddr('broadcast') }}
  hwaddress ether {{ ( vtn_net_management_host_hwaddr_prefix ~ ( mgmtbridge_ip | ip4_hex )) | hwaddr('linux') }}
  dns-search {{ site_suffix }}
  dns-nameservers {{ dns_servers | join(" ") }}
  post-down ip link del {{ management_net_bridge }}

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

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

{% endfor %}
{% endif %}

# veth interfaces for VTN MANAGEMENT_HOST
# vethmgmt0: connected to mgmtbond
auto vethmgmt0
iface vethmgmt0 inet manual
  pre-up ip link add vethmgmt0 type veth peer name vethmgmt1
  pre-up ip link set vethmgmt0 up
  pre-up ip link set vethmgmt1 up
  post-up ip link set dev vethmgmt0 master {{ management_net_bridge }}
  pre-down ip link set dev vethmgmt0 nomaster
  post-down ip link del vethmgmt0

# vethmgmt1: connected to VTN as hostManagementIface, if enabled
# Brought up by vethmgmt0

{% endfor %}

