heat_template_version: rocky
description: >
  Software Config to drive os-net-config for a simple bridge configured with a
  static IP address for the ctlplane network.
parameters:
  ControlPlaneIp:
    default: ''
    description: IP address/subnet on the ctlplane network
    type: string
  {%- for network in networks %}
  {{network.name}}IpSubnet:
    default: ''
    description: IP address/subnet on the {{network.name_lower}} network
    type: string
  {{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
  {{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
  {%- endfor %}
  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
  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
  UndercloudLocalMtu: # Override this via parameter_defaults
    default: 1500
    description: MTU to use for the Undercloud local_interface.
    type: number
    constraints:
      - range: { min: 1000, max: 65536 }
  UndercloudNetConfigOverride:
    default: {}
    description: Custom JSON data to be used to override the os-net-config data in this template. This is meant to be used by net_config_override parameter in tripleoclient to provide an easy means to pass in custom net configs for the Undercloud.
    type: json
  EC2MetadataIp: # Here for compatability, not used.
    default: ''
    description: The IP address of the EC2 metadata server. (The parameter
      is automatically resolved from the ctlplane subnet's host_routes attribute.)
    type: string

conditions:
  undercloud_net_config_override:
    not:
      equals: [{get_param: UndercloudNetConfigOverride}, {}]

resources:
  OsNetConfigImpl:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      inputs:
        - name: disable_configure_safe_defaults
          default: true
      config:
        str_replace:
          template:
            get_file: network/scripts/run-os-net-config.sh
          params:
            $network_config:
              if:
              - undercloud_net_config_override
              - {get_param: UndercloudNetConfigOverride}
              - network_config:
                - type: ovs_bridge
                  name: br-ctlplane
                  use_dhcp: false
                  dns_servers:
                    get_param: DnsServers
                  ovs_extra:
                    - "br-set-external-id br-ctlplane bridge-id br-ctlplane"
                  addresses:
                  - ip_netmask:
                      list_join:
                      - /
                      - - get_param: ControlPlaneIp
                        - get_param: ControlPlaneSubnetCidr
                  routes: {get_param: ControlPlaneStaticRoutes}
                  members:
                  - type: interface
                    name: interface_name
                    # force the MAC address of the bridge to this interface
                    primary: true
                    mtu: {get_param: UndercloudLocalMtu}
outputs:
  OS::stack_id:
    description: The OsNetConfigImpl resource.
    value:
      get_resource: OsNetConfigImpl