# FIXME: This legacy template should be converted to a composable role
heat_template_version: rocky
description: >
  Software Config to drive os-net-config to configure multiple interfaces for the
  compute role with external bridge for DVR.
parameters:
  ControlPlaneIp:
    default: ''
    description: IP address/subnet on the ctlplane network
    type: string
  ControlPlaneSubnetCidr:
    default: ''
    description: >
      The subnet CIDR of the control plane network. (The parameter is
      automatically resolved from the ctlplane subnet's cidr attribute.)
    type: string
  ControlPlaneDefaultRoute:
    default: ''
    description: The default route of the control plane network. (The parameter
      is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
    type: string
  ControlPlaneStaticRoutes:
    default: []
    description: >
      Routes for the ctlplane network traffic.
      JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
      Unless the default is changed, the parameter is automatically resolved
      from the subnet host_routes attribute.
    type: json
  ControlPlaneMtu:
    default: 1500
    description: The maximum transmission unit (MTU) size(in bytes) that is
      guaranteed to pass through the data path of the segments in the network.
      (The parameter is automatically resolved from the ctlplane network's mtu attribute.)
    type: number
{% for network in networks %}
  {{network.name}}IpSubnet:
    default: ''
    description: IP address/subnet on the {{network.name_lower}} network
    type: string
  {{network.name}}NetworkVlanID:
    default: {{network.vlan|default(1)}}
    description: Vlan ID for the {{network.name_lower}} network traffic.
    type: number
  {{network.name}}Mtu:
    default: {{network.mtu|default('1500')}}
    description: The maximum transmission unit (MTU) size(in bytes) that is
      guaranteed to pass through the data path of the segments in the
      {{network.name}} network.
    type: number
  {{network.name}}InterfaceRoutes:
    default: []
    description: >
      Routes for the {{network.name_lower}} network traffic.
      JSON route e.g. [{'destination':'10.0.0.0/16', 'nexthop':'10.0.0.1'}]
      Unless the default is changed, the parameter is automatically resolved
      from the subnet host_routes attribute.
    type: json
{%- endfor %}
  # Uncomment when including environments/network-management.yaml and setting
  # default route on the Management interface. Also comment out the default
  # route on the Control Plane and add the Management network to the roles
  # default_route_networks in roles data.
  # ManagementInterfaceDefaultRoute:
  #   default: ''
  #   description: default route for the management network
  #   type: string
  DnsServers: # Override this via parameter_defaults
    default: []
    description: >
      DNS servers to use for the Overcloud (2 max for some implementations).
      If not set the nameservers configured in the ctlplane subnet's
      dns_nameservers attribute will be used.
    type: comma_delimited_list
  DnsSearchDomains: # Override this via parameter_defaults
    default: []
    description: A list of DNS search domains to be added (in order) to resolv.conf.
    type: comma_delimited_list

resources:
  OsNetConfigImpl:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config:
        str_replace:
          template:
            get_file: ../../scripts/run-os-net-config.sh
          params:
            $network_config:
              network_config:
              - type: interface
                name: nic1
                mtu:
                  get_param: ControlPlaneMtu
                use_dhcp: false
                dns_servers:
                  get_param: DnsServers
                domain:
                  get_param: DnsSearchDomains
                addresses:
                - ip_netmask:
                    list_join:
                    - /
                    - - get_param: ControlPlaneIp
                      - get_param: ControlPlaneSubnetCidr
                routes:
                  list_concat_unique:
                    - get_param: ControlPlaneStaticRoutes
                    - - default: true
                        next_hop:
                          get_param: ControlPlaneDefaultRoute
              - type: interface
                name: nic2
                mtu:
                  get_param: StorageMtu
                use_dhcp: false
              - type: vlan
                device: nic2
                mtu:
                  get_param: StorageMtu
                vlan_id:
                  get_param: StorageNetworkVlanID
                addresses:
                - ip_netmask:
                    get_param: StorageIpSubnet
                routes:
                  get_param: StorageInterfaceRoutes
              - type: interface
                name: nic4
                mtu:
                  get_param: InternalApiMtu
                use_dhcp: false
              - type: vlan
                device: nic4
                mtu:
                  get_param: InternalApiMtu
                vlan_id:
                  get_param: InternalApiNetworkVlanID
                addresses:
                - ip_netmask:
                    get_param: InternalApiIpSubnet
                routes:
                  get_param: InternalApiInterfaceRoutes
              - type: ovs_bridge
                name: br-tenant
                mtu:
                  get_param: TenantMtu
                use_dhcp: false
                addresses:
                - ip_netmask:
                    get_param: TenantIpSubnet
                routes:
                  get_param: TenantInterfaceRoutes
                members:
                - type: interface
                  name: nic5
                  mtu:
                    get_param: TenantMtu
                  use_dhcp: false
                  primary: true
              # External bridge for DVR (no IP address required)
              - type: ovs_bridge
                name: bridge_name
                mtu:
                  get_param: ExternalMtu
                dns_servers:
                  get_param: DnsServers
                use_dhcp: false
                members:
                - type: interface
                  name: nic6
                  mtu:
                    get_param: ExternalMtu
                  primary: true
            # Uncomment when including environments/network-management.yaml
            # If setting default route on the Management interface, comment
            # out the default route on the Control Plane.
            #- type: interface
            #  name: nic7
            #  mtu:
            #    get_param: ManagementMtu
            #  use_dhcp: false
            #  addresses:
            #    - ip_netmask:
            #        get_param: ManagementIpSubnet
            #  routes:
            #    list_concat_unique:
            #      - get_param: ManagementInterfaceRoutes
            #      - - default: true
            #          next_hop:
            #            get_param: ManagementInterfaceDefaultRoute
outputs:
  OS::stack_id:
    description: The OsNetConfigImpl resource.
    value:
      get_resource: OsNetConfigImpl

