heat_template_version: 2015-04-30
description: 'All Nodes Config for Puppet'

parameters:
  compute_hosts:
    type: comma_delimited_list
  controller_hosts:
    type: comma_delimited_list
  controller_ips:
    type: comma_delimited_list
  block_storage_hosts:
    type: comma_delimited_list
  object_storage_hosts:
    type: comma_delimited_list
  ceph_storage_hosts:
    type: comma_delimited_list
  controller_names:
    type: comma_delimited_list
  rabbit_node_ips:
    type: comma_delimited_list
  mongo_node_ips:
    type: comma_delimited_list
  redis_node_ips:
    type: comma_delimited_list
  memcache_node_ips:
    type: comma_delimited_list
  mysql_node_ips:
    type: comma_delimited_list
  horizon_node_ips:
    type: comma_delimited_list
  heat_api_node_ips:
    type: comma_delimited_list
  swift_proxy_node_ips:
    type: comma_delimited_list
  ceilometer_api_node_ips:
    type: comma_delimited_list
  nova_api_node_ips:
    type: comma_delimited_list
  nova_metadata_node_ips:
    type: comma_delimited_list
  glance_api_node_ips:
    type: comma_delimited_list
  glance_registry_node_ips:
    type: comma_delimited_list
  cinder_api_node_ips:
    type: comma_delimited_list
  neutron_api_node_ips:
    type: comma_delimited_list
  keystone_public_api_node_ips:
    type: comma_delimited_list
  keystone_admin_api_node_ips:
    type: comma_delimited_list
  sahara_api_node_ips:
    type: comma_delimited_list

  DeployIdentifier:
    type: string
    description: >
      Setting this to a unique value will re-run any deployment tasks which
      perform configuration on a Heat stack-update.
  UpdateIdentifier:
    type: string
    description: >
      Setting to a previously unused value during stack-update will trigger
      package update on all nodes

resources:

  allNodesConfigImpl:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        hosts:
          list_join:
          - "\n"
          - - list_join:
              - "\n"
              - {get_param: compute_hosts}
            - list_join:
              - "\n"
              - {get_param: controller_hosts}
            - list_join:
              - "\n"
              - {get_param: block_storage_hosts}
            - list_join:
              - "\n"
              - {get_param: object_storage_hosts}
            - list_join:
              - "\n"
              - {get_param: ceph_storage_hosts}
        hiera:
          datafiles:
            RedHat:
              raw_data: {get_file: hieradata/RedHat.yaml}
            all_nodes:
              mapped_data:
                controller_node_ips:
                  list_join:
                  - ','
                  - {get_param: controller_ips}
                controller_node_names:
                  list_join:
                  - ','
                  - {get_param: controller_names}
                galera_node_names:
                  list_join:
                  - ','
                  - {get_param: controller_names}
                rabbit_node_ips: &rabbit_nodes_array
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: rabbit_node_ips}
                mongo_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: mongo_node_ips}
                redis_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: redis_node_ips}
                memcache_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: memcache_node_ips}
                memcache_node_ips_v6:
                  str_replace:
                    template: "['inet6:[SERVERS_LIST]']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "]','inet6:["
                        - {get_param: memcache_node_ips}
                mysql_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: mysql_node_ips}
                horizon_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: horizon_node_ips}
                heat_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: heat_api_node_ips}
                swift_proxy_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: swift_proxy_node_ips}
                ceilometer_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: ceilometer_api_node_ips}
                nova_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: nova_api_node_ips}
                nova_metadata_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: nova_metadata_node_ips}
                glance_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: glance_api_node_ips}
                glance_registry_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: glance_registry_node_ips}
                cinder_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: cinder_api_node_ips}
                neutron_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: neutron_api_node_ips}
                # TODO: pass a `midonet_api_node_ips` var
                midonet_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: neutron_api_node_ips}
                keystone_public_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: keystone_public_api_node_ips}
                keystone_admin_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: keystone_admin_api_node_ips}
                sahara_api_node_ips:
                  str_replace:
                    template: "['SERVERS_LIST']"
                    params:
                      SERVERS_LIST:
                        list_join:
                        - "','"
                        - {get_param: sahara_api_node_ips}

                # NOTE(gfidente): interpolation with %{} in the
                # hieradata file can't be used as it returns string
                ceilometer::rabbit_hosts: *rabbit_nodes_array
                cinder::rabbit_hosts: *rabbit_nodes_array
                glance::notify::rabbitmq::rabbit_hosts: *rabbit_nodes_array
                heat::rabbit_hosts: *rabbit_nodes_array
                neutron::rabbit_hosts: *rabbit_nodes_array
                nova::rabbit_hosts: *rabbit_nodes_array
                keystone::rabbit_hosts: *rabbit_nodes_array
                sahara::rabbit_hosts: *rabbit_nodes_array

                deploy_identifier: {get_param: DeployIdentifier}
                update_identifier: {get_param: UpdateIdentifier}

outputs:
  config_id:
    description: The ID of the allNodesConfigImpl resource.
    value:
      {get_resource: allNodesConfigImpl}
  hosts_entries:
    description: |
      The content that should be appended to your /etc/hosts if you want to get
      hostname-based access to the deployed nodes (useful for testing without
      setting up a DNS).
    value: {get_attr: [allNodesConfigImpl, config, hosts]}