heat_template_version: 2016-10-14

description: >
  Software Config to drive os-net-config to configure multiple interfaces
  for the {{ role }} role.

parameters:
  ControlPlaneIp:
    default: ''
    description: IP address/subnet on the ctlplane network
    type: string
  ExternalIpSubnet:
    default: ''
    description: IP address/subnet on the external network
    type: string
  InternalApiIpSubnet:
    default: ''
    description: IP address/subnet on the internal API network
    type: string
  StorageIpSubnet:
    default: ''
    description: IP address/subnet on the storage network
    type: string
  StorageMgmtIpSubnet:
    default: ''
    description: IP address/subnet on the storage mgmt network
    type: string
  TenantIpSubnet:
    default: ''
    description: IP address/subnet on the tenant network
    type: string
  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
    default: ''
    description: IP address/subnet on the management network
    type: string
  ExternalNetworkVlanID:
    default: 10
    description: Vlan ID for the external network traffic.
    type: number
  InternalApiNetworkVlanID:
    default: 20
    description: Vlan ID for the internal_api network traffic.
    type: number
  StorageNetworkVlanID:
    default: 30
    description: Vlan ID for the storage network traffic.
    type: number
  StorageMgmtNetworkVlanID:
    default: 40
    description: Vlan ID for the storage mgmt network traffic.
    type: number
  TenantNetworkVlanID:
    default: 50
    description: Vlan ID for the tenant network traffic.
    type: number
  ManagementNetworkVlanID:
    default: 60
    description: Vlan ID for the management network traffic.
    type: number
  ExternalInterfaceDefaultRoute:
    default: '10.0.0.1'
    description: default route for the external network
    type: string
  ControlPlaneSubnetCidr: # Override this via parameter_defaults
    default: '24'
    description: The subnet CIDR of the control plane network.
    type: string
  ControlPlaneDefaultRoute: # Override this via parameter_defaults
    description: The default route of the control plane network.
    type: string
  DnsServers: # Override this via parameter_defaults
    default: []
    description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
    type: comma_delimited_list
  EC2MetadataIp: # Override this via parameter_defaults
    description: The IP address of the EC2 metadata server.
    type: string

resources:
  OsNetConfigImpl:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config:
        str_replace:
          template:
            get_file: /usr/share/openstack-tripleo-heat-templates/network/scripts/run-os-net-config.sh
          params:
            $network_config:
              network_config:
              -
              {%- if not nets['external'][0]['enabled'] or nets['tenant']['nic_mapping'][role]['vlan'] is number or nets['storage']['nic_mapping'][role]['vlan'] is number or nets['api']['nic_mapping'][role]['vlan'] is number or  nets['external'][0]['nic_mapping'][role]['vlan'] is number %}
                type: ovs_bridge
              {%- if nets['external'][0]['enabled'] and nets['external'][0]['nic_mapping'][role]['vlan'] == 'native' %}
                name: br-isolated
              {%- else %}
                name: br-ex
              {%- endif %}
                members:
                  -
                    type: interface
                    name: {{ nets['admin']['nic_mapping'][role]['members'][0] }}
                    # force the MAC address of the bridge to this interface
                    primary: true
                  {%- if nets['external'][0]['enabled'] and nets['external'][0]['nic_mapping'][role]['vlan'] is number %}
                  -
                    type: vlan
                    vlan_id: {get_param: ExternalNetworkVlanID}
                    addresses:
                    -
                      ip_netmask: {get_param: ExternalIpSubnet}
                    routes:
                      -
                        default: true
                        next_hop: {get_param: ExternalInterfaceDefaultRoute}
                  {%- endif %}
                  {%- if nets['tenant']['enabled'] and nets['tenant']['nic_mapping'][role]['vlan'] is number %}
                  -
                    type: vlan
                    vlan_id: {get_param: TenantNetworkVlanID}
                    addresses:
                      -
                        ip_netmask: {get_param: TenantIpSubnet}
                  {%- endif %}
                  {%- if nets['storage']['enabled'] and nets['storage']['nic_mapping'][role]['vlan'] is number %}
                  -
                    type: vlan
                    vlan_id: {get_param: StorageNetworkVlanID}
                    addresses:
                      -
                        ip_netmask: {get_param: StorageIpSubnet}
                  {%- endif %}
                  {%- if nets['api']['enabled'] and nets['api']['nic_mapping'][role]['vlan'] is number %}
                  -
                    type: vlan
                    vlan_id: {get_param: InternalApiNetworkVlanID}
                    addresses:
                      -
                        ip_netmask: {get_param: InternalApiIpSubnet}
                  {%- endif %}
              {%- else %}
                type: {{ nets['admin']['nic_mapping'][role]['phys_type'] }}
                {%- if nets['admin']['nic_mapping'][role]['phys_type'] == 'linux_bridge' %}
                name: br-ctlplane
                members:
                  -
                    type: interface
                    name: {{ nets['admin']['nic_mapping'][role]['members'][0] }}
                    primary: true
                {%- else %}
                name: {{ nets['admin']['nic_mapping'][role]['members'][0] }}
                {%- endif %}
              {%- endif %}
                use_dhcp: false
                dns_servers: {get_param: DnsServers}
                addresses:
                  -
                    ip_netmask:
                      list_join:
                        - '/'
                        - - {get_param: ControlPlaneIp}
                          - {get_param: ControlPlaneSubnetCidr}
                routes:
                  -
                    ip_netmask: 169.254.169.254/32
                    next_hop: {get_param: EC2MetadataIp}
                  {%- if external_net_af == 6 or role == 'compute' or not nets['external'][0]['enabled'] %}
                  -
                    default: true
                    next_hop: {get_param: ControlPlaneDefaultRoute}
                  {%- endif %}

              {%- if nets['tenant']['enabled'] and nets['tenant']['nic_mapping'][role]['vlan'] == 'native' %}
              {%- if ovs_dpdk_bridge == 'br-phy' and role == 'compute' %}
              -
                type: ovs_user_bridge
                name: {{ ovs_dpdk_bridge }}
                use_dhcp: false
                addresses:
                  -
                    ip_netmask: {get_param: TenantIpSubnet}
                members:
                  -
                    type: ovs_dpdk_port
                    name: dpdk0
                    driver: {{ nets['tenant']['nic_mapping'][role]['uio_driver'] }}
                    members:
                      -
                        type: interface
                        name: {{ nets['tenant']['nic_mapping'][role]['members'][0] }}
                        # force the MAC address of the bridge to this interface
                        primary: true
              {%- elif nets['tenant']['segmentation_type'] == 'vlan' %}
                type: ovs_bridge
                name: br-vlan
                use_dhcp: false
                addresses:
                  -
                    ip_netmask: {get_param: TenantIpSubnet}
                members:
                  -
                    type: interface
                    name: {{ nets['tenant']['nic_mapping'][role]['members'][0] }}
                    primary: true
              {%- else %}
              -
                type: {{ nets['tenant']['nic_mapping'][role]['phys_type'] }}
                name: {{ nets['tenant']['nic_mapping'][role]['members'][0] }}
                {%- if 'uio-driver' in nets['tenant']['nic_mapping'][role] %}
                uio_driver: {{ nets['tenant']['nic_mapping'][role]['uio-driver'] }}
                {%- endif %}
                {%- if 'interface-options' in nets['tenant']['nic_mapping'][role] %}
                options: '{{ nets['tenant']['nic_mapping'][role]['interface-options'] }}'
                {%- endif %}
                use_dhcp: false
                addresses:
                  -
                    ip_netmask: {get_param: TenantIpSubnet}
              {%- endif %}
              {%- endif %}
              {%- if nets['external'][0]['enabled'] and external_net_type != 'br-ex' and nets['external'][0]['nic_mapping'][role]['vlan'] == 'native' %}
              -
                type: {{ nets['external'][0]['nic_mapping'][role]['phys_type'] }}
                name: {{ nets['external'][0]['nic_mapping'][role]['members'][0] }}
                {%- if 'uio-driver' in nets['external'][0]['nic_mapping'][role] %}
                uio_driver: {{ nets['external'][0]['nic_mapping'][role]['uio-driver'] }}
                {%- endif %}
                {%- if role == 'controller' %}
                dns_servers: {get_param: DnsServers}
                {%- endif %}
                use_dhcp: false
                addresses:
                  -
                    ip_netmask: {get_param: ExternalIpSubnet}
                routes:
                  -
                    {%- if role == 'controller' %}
                    default: true
                    {%- endif %}
                    ip_netmask: 0.0.0.0/0
                    next_hop: {get_param: ExternalInterfaceDefaultRoute}
              {%- elif nets['external'][0]['enabled'] and external_net_type == 'br-ex' and nets['external'][0]['nic_mapping'][role]['vlan'] == 'native' %}
              -
                {%- if ovs_dpdk_bridge == 'br-phy' and role == 'compute' %}
                type: ovs_user_bridge
                {%- else %}
                type: {{ nets['external'][0]['nic_mapping'][role]['phys_type'] }}
                {%- endif %}
                name: br-ex
                use_dhcp: false
                members:
                  -
                    type: interface
                    name: {{ nets['external'][0]['nic_mapping'][role]['members'][0] }}
                    # force the MAC address of the bridge to this interface
                    primary: true
                dns_servers: {get_param: DnsServers}
                addresses:
                  -
                    ip_netmask: {get_param: ExternalIpSubnet}
                routes:
                  -
                    default: true
                    ip_netmask: 0.0.0.0/0
                    next_hop: {get_param: ExternalInterfaceDefaultRoute}
              {%- endif %}
              {%- if nets['storage']['enabled'] and nets['storage']['nic_mapping'][role]['vlan'] == 'native' %}
              -
                type: interface
                name: {{ nets['storage']['nic_mapping'][role]['members'][0] }}
                use_dhcp: false
                addresses:
                  -
                    ip_netmask: {get_param: StorageIpSubnet}
              {%- endif %}
              {%- if nets['api']['enabled'] and nets['api']['nic_mapping'][role]['vlan'] == 'native' %}
              -
                type: interface
                name: {{ nets['api']['nic_mapping'][role]['members'][0] }}
                use_dhcp: false
                addresses:
                  -
                    ip_netmask: {get_param: InternalApiIpSubnet}
              {%- endif %}

outputs:
  OS::stack_id:
    description: The OsNetConfigImpl resource.
    value: {get_resource: OsNetConfigImpl}