heat_template_version: ocata

parameters:
  ControlPlaneIp:
    default: ''
    type: string
  ControlPlaneSubnetCidr: # Override this via parameter_defaults
    default: '24'
    description: The subnet CIDR of the control plane network.
    type: string
  ExternalIp:
    default: ''
    type: string
  ExternalIpSubnet:
    default: ''
    type: string
  ExternalIpUri:
    default: ''
    type: string
    description: IP address with brackets in case of IPv6
  InternalApiIp:
    default: ''
    type: string
  InternalApiIpSubnet:
    default: ''
    type: string
  InternalApiIpUri:
    default: ''
    type: string
    description: IP address with brackets in case of IPv6
  StorageIp:
    default: ''
    type: string
  StorageIpSubnet:
    default: ''
    type: string
  StorageIpUri:
    default: ''
    type: string
    description: IP address with brackets in case of IPv6
  StorageMgmtIp:
    default: ''
    type: string
  StorageMgmtIpSubnet:
    default: ''
    type: string
  StorageMgmtIpUri:
    default: ''
    type: string
    description: IP address with brackets in case of IPv6
  TenantIp:
    default: ''
    type: string
  TenantIpSubnet:
    default: ''
    type: string
  TenantIpUri:
    default: ''
    type: string
    description: IP address with brackets in case of IPv6
  ManagementIp:
    default: ''
    type: string
  ManagementIpSubnet:
    default: ''
    type: string
  ManagementIpUri:
    default: ''
    type: string
    description: IP address with brackets in case of IPv6

  InternalApiNetName:
    default: internal_api
    description: The name of the internal API network.
    type: string
  ExternalNetName:
    default: external
    description: The name of the external network.
    type: string
  ManagementNetName:
    default: management
    description: The name of the management network.
    type: string
  StorageNetName:
    default: storage
    description: The name of the storage network.
    type: string
  StorageMgmtNetName:
    default: storage_mgmt
    description: The name of the Storage management network.
    type: string
  TenantNetName:
    default: tenant
    description: The name of the tenant network.
    type: string

resources:

  NetIpMapValue:
    type: OS::Heat::Value
    properties:
      type: json
      value:
        map_replace:
          - ctlplane: {get_param: ControlPlaneIp}
            external: {get_param: ExternalIp}
            internal_api: {get_param: InternalApiIp}
            storage: {get_param: StorageIp}
            storage_mgmt: {get_param: StorageMgmtIp}
            tenant: {get_param: TenantIp}
            management: {get_param: ManagementIp}
            ctlplane_subnet:
              list_join:
                - ''
                - - {get_param: ControlPlaneIp}
                  - '/'
                  - {get_param: ControlPlaneSubnetCidr}
            external_subnet: {get_param: ExternalIpSubnet}
            internal_api_subnet: {get_param: InternalApiIpSubnet}
            storage_subnet: {get_param: StorageIpSubnet}
            storage_mgmt_subnet: {get_param: StorageMgmtIpSubnet}
            tenant_subnet: {get_param: TenantIpSubnet}
            management_subnet: {get_param: ManagementIpSubnet}
            ctlplane_uri: {get_param: ControlPlaneIp}
            external_uri: {get_param: ExternalIpUri}
            internal_api_uri: {get_param: InternalApiIpUri}
            storage_uri: {get_param: StorageIpUri}
            storage_mgmt_uri: {get_param: StorageMgmtIpUri}
            tenant_uri: {get_param: TenantIpUri}
            management_uri: {get_param: ManagementIpUri}
          - keys:
              external: {get_param: ExternalNetName}
              internal_api: {get_param: InternalApiNetName}
              storage: {get_param: StorageNetName}
              storage_mgmt: {get_param: StorageMgmtNetName}
              tenant: {get_param: TenantNetName}
              management: {get_param: ManagementNetName}
              external_subnet:
                str_replace:
                  template: NAME_subnet
                  params:
                    NAME: {get_param: ExternalNetName}
              internal_api_subnet:
                str_replace:
                  template: NAME_subnet
                  params:
                    NAME: {get_param: InternalApiNetName}
              storage_subnet:
                str_replace:
                  template: NAME_subnet
                  params:
                    NAME: {get_param: StorageNetName}
              storage_mgmt_subnet:
                str_replace:
                  template: NAME_subnet
                  params:
                    NAME: {get_param: StorageMgmtNetName}
              tenant_subnet:
                str_replace:
                  template: NAME_subnet
                  params:
                    NAME: {get_param: TenantNetName}
              management_subnet:
                str_replace:
                  template: NAME_subnet
                  params:
                    NAME: {get_param: ManagementNetName}
              external_uri:
                str_replace:
                  template: NAME_uri
                  params:
                    NAME: {get_param: ExternalNetName}
              internal_api_uri:
                str_replace:
                  template: NAME_uri
                  params:
                    NAME: {get_param: InternalApiNetName}
              storage_uri:
                str_replace:
                  template: NAME_uri
                  params:
                    NAME: {get_param: StorageNetName}
              storage_mgmt_uri:
                str_replace:
                  template: NAME_uri
                  params:
                    NAME: {get_param: StorageMgmtNetName}
              tenant_uri:
                str_replace:
                  template: NAME_uri
                  params:
                    NAME: {get_param: TenantNetName}
              management_uri:
                str_replace:
                  template: NAME_uri
                  params:
                    NAME: {get_param: ManagementNetName}

outputs:
  net_ip_map:
    description: >
      A Hash containing a mapping of network names to assigned IPs
      for a specific machine.
    value: {get_attr: [NetIpMapValue, value]}