heat_template_version: pike

description: >
  Mapping of service_name_network -> network name

parameters:
  ServiceNetMap:
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.  This
                 mapping overrides those in ServiceNetMapDefaults.
                 Note that the key in this map must match the service_name
                 in the service template, e.g if the service_name is heat_api
                 the key must be either heat_api_network, or optionally
                 HeatApiNetwork (which will be internally converted to
                 transform captalization to underscores).
    default: {}
    type: json

  # Note that the key in this map must match the service_name
  # see the description above about conversion from CamelCase to
  # snake_case - the names must still match when converted
  ServiceNetMapDefaults:
    default:
      # Note the values in this map are replaced by *NetName
      # to allow for sane defaults when the network names are
      # overridden.
      ApacheNetwork: internal_api
      NeutronTenantNetwork: tenant
      CeilometerApiNetwork: internal_api
      ContrailAnalyticsNetwork: internal_api
      ContrailAnalyticsDatabaseNetwork: internal_api
      ContrailConfigNetwork: internal_api
      ContrailControlNetwork: internal_api
      ContrailDatabaseNetwork: internal_api
      ContrailWebuiNetwork: internal_api
      ContrailTsnNetwork: internal_api
      AodhApiNetwork: internal_api
      PankoApiNetwork: internal_api
      BarbicanApiNetwork: internal_api
      GnocchiApiNetwork: internal_api
      MongodbNetwork: internal_api
      CinderApiNetwork: internal_api
      CinderIscsiNetwork: storage
      CongressApiNetwork: internal_api
      GlanceApiNetwork: internal_api
      IronicApiNetwork: ctlplane
      IronicNetwork: ctlplane
      IronicInspectorNetwork: ctlplane
      KeystoneAdminApiNetwork: ctlplane # allows undercloud to config endpoints
      KeystonePublicApiNetwork: internal_api
      ManilaApiNetwork: internal_api
      NeutronApiNetwork: internal_api
      OctaviaApiNetwork: internal_api
      HeatApiNetwork: internal_api
      HeatApiCfnNetwork: internal_api
      HeatApiCloudwatchNetwork: internal_api
      NovaApiNetwork: internal_api
      NovaPlacementNetwork: internal_api
      NovaMetadataNetwork: internal_api
      NovaVncProxyNetwork: internal_api
      NovaLibvirtNetwork: internal_api
      Ec2ApiNetwork: internal_api
      Ec2ApiMetadataNetwork: internal_api
      TackerApiNetwork: internal_api
      SwiftStorageNetwork: storage_mgmt
      SwiftProxyNetwork: storage
      SaharaApiNetwork: internal_api
      HorizonNetwork: internal_api
      MemcachedNetwork: internal_api
      RabbitmqNetwork: internal_api
      QdrNetwork: internal_api
      RedisNetwork: internal_api
      MysqlNetwork: internal_api
      SnmpdNetwork: ctrlplane
      CephClusterNetwork: storage_mgmt
      CephMonNetwork: storage
      CephRgwNetwork: storage
      PublicNetwork: external
      OpendaylightApiNetwork: internal_api
      OvnDbsNetwork: internal_api
      MistralApiNetwork: internal_api
      ZaqarApiNetwork: internal_api
      PacemakerRemoteNetwork: internal_api
      # We special-case the default ResolveNetwork for the CephStorage role
      # for backwards compatibility, all other roles default to internal_api
      CephStorageHostnameResolveNetwork: storage
      EtcdNetwork: internal_api
{% for role in roles if role.name != 'CephStorage' %}
      {{role.name}}HostnameResolveNetwork: internal_api
{% endfor %}
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.
    type: json

  # We define mappings to work around names that break when doing the
  # CamelCase to snake_case conversion to align with service_names
  ServiceNetMapDeprecatedMapping:
    default:
      MongoDbNetwork: MongodbNetwork
      RabbitMqNetwork: RabbitmqNetwork
      CephPublicNetwork: CephMonNetwork
      SwiftMgmtNetwork: SwiftStorageNetwork
    description: Mapping older deprecated service names, intended for
                 internal use only, this will be removed in future.
    type: json

{%- for network in networks %}
  {{network.name}}NetName:
    default: {{network.name_lower}}
    description: The name of the {{network.name_lower}} network.
    type: string
{%- endfor %}

parameter_groups:
- label: deprecated
  description: Do not use deprecated params, they will be removed.
  parameters:
  - ServiceNetMapDeprecatedMapping

resources:
  ServiceNetMapValue:
    type: OS::Heat::Value
    properties:
      type: json
      value:
        map_merge:
          - map_replace:
             - {get_param: ServiceNetMapDefaults}
             - values:
{%- for network in networks %}
                 {{network.name_lower}}: {get_param: {{network.name}}NetName}
{%- endfor %}
          - map_replace:
             - {get_param: ServiceNetMap}
             - keys: {get_param: ServiceNetMapDeprecatedMapping}


outputs:
  service_net_map:
    value: {get_attr: [ServiceNetMapValue, value]}

  service_net_map_lower:
    value:
      # This does a conversion from CamelCase to snake_case,
      # e.g HeatApiNetwork becomes heat_api_network so it
      # matches the service names.
      yaql:
        expression: dict($.data.map.items().select([ regex(`([a-z0-9])([A-Z])`).replace($[0], '\\1_\\2').toLower(), $[1]]))
        data:
          map: {get_attr: [ServiceNetMapValue, value]}
