Merge "Make Swift replica count configurable."
[apex-tripleo-heat-templates.git] / overcloud-source.yaml
index 040506e..63ebb20 100644 (file)
@@ -1,33 +1,33 @@
-Description: Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
+description: Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
   server,Dedicated RabbitMQ Server,Group of Nova Computes
-HeatTemplateFormatVersion: '2012-12-12'
-Parameters:
+heat_template_version: 2013-05-23
+parameters:
   AdminPassword:
-    Default: unset
-    Description: The password for the keystone admin account, used for monitoring, querying neutron etc.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the keystone admin account, used for monitoring, querying neutron etc.
+    type: string
+    hidden: true
   AdminToken:
-    Default: unset
-    Description: The keystone auth secret.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The keystone auth secret.
+    type: string
+    hidden: true
   CinderPassword:
-    Default: unset
-    Description: The password for the cinder service account, used by cinder-api.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the cinder service account, used by cinder-api.
+    type: string
+    hidden: true
   CinderISCSIHelper:
-    Default: tgtadm
-    Description: The iSCSI helper to use with cinder.
-    Type: String
+    default: tgtadm
+    description: The iSCSI helper to use with cinder.
+    type: string
   CinderLVMLoopDeviceSize:
-    Default: 5000
-    Description: The size of the loopback file used by the cinder LVM driver.
-    Type: Number
+    default: 5000
+    description: The size of the loopback file used by the cinder LVM driver.
+    type: number
   ExtraConfig:
-    Default: {}
-    Description: |
+    default: {}
+    description: |
       Additional configuration to inject into the cluster. The JSON should have
       the following structure:
         {"FILEKEY":
@@ -62,466 +62,704 @@ Parameters:
             ]
           }
         }
-    Type: Json
+    type: json
   OvercloudControlFlavor:
-    Default: baremetal
-    Description: Flavor for control nodes to request when deploying.
-    Type: String
+    default: baremetal
+    description: Flavor for control nodes to request when deploying.
+    type: string
   OvercloudComputeFlavor:
-    Default: baremetal
-    Description: Flavor for compute nodes to request when deploying.
-    Type: String
+    default: baremetal
+    description: Flavor for compute nodes to request when deploying.
+    type: string
+  GlancePort:
+    default: 9292
+    description: Glance port.
+    type: string
+  GlanceProtocol:
+    default: http
+    description: Protocol to use when connecting to glance, set to https for SSL.
+    type: string
   GlancePassword:
-    Default: unset
-    Description: The password for the glance service account, used by the glance services.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the glance service account, used by the glance services.
+    type: string
+    hidden: true
   GlanceNotifierStrategy:
-    Description: Strategy to use for Glance notification queue
-    Type: String
-    Default: noop
+    description: Strategy to use for Glance notification queue
+    type: string
+    default: noop
   GlanceLogFile:
-    Description: The filepath of the file to use for logging messages from Glance.
-    Type: String
-    Default: ''
+    description: The filepath of the file to use for logging messages from Glance.
+    type: string
+    default: ''
   HeatPassword:
-    Default: unset
-    Description: The password for the Heat service account, used by the Heat services.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the Heat service account, used by the Heat services.
+    type: string
+    hidden: true
   ImageUpdatePolicy:
-    Default: 'REBUILD_PRESERVE_EPHEMERAL'
-    Description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
-    Type: String
+    default: 'REBUILD_PRESERVE_EPHEMERAL'
+    description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
+    type: string
   KeyName:
-    Default: default
-    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
-    Type: String
+    default: default
+    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
+    type: string
   NeutronBridgeMappings:
-    Description: The OVS logical->physical bridge mappings to use.
-    Type: String
-    Default: ''
+    description: |
+      The OVS logical->physical bridge mappings to use. See the Neutron
+      documentation for details. Defaults to mapping br-ex - the external
+      bridge on hosts - to a physical name 'datacentre' which can be used
+      to create provider networks (and we use this for the default floating
+      network) - if changing this either use different post-install network
+      scripts or be sure to keep 'datacentre' as a mapping network name.
+    type: string
+    default: "datacentre:br-ex"
+  NeutronNetworkVLANRanges:
+    default: 'datacentre'
+    description: |
+      The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
+      Neutron documentation for permitted values. Defaults to permitting any
+      VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
+    type: string
   NeutronPassword:
-    Default: unset
-    Description: The password for the neutron service account, used by neutron agents.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the neutron service account, used by neutron agents.
+    type: string
+    hidden: true
   CeilometerComputeAgent:
-    Description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
-    Type: String
-    Default: ''
-    AllowedValues: ['', Present]
+    description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
+    type: string
+    default: ''
+    constraints:
+    - allowed_values: ['', Present]
   CeilometerMeteringSecret:
-    Default: unset
-    Description: Secret shared by the ceilometer services.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: Secret shared by the ceilometer services.
+    type: string
+    hidden: true
   CeilometerPassword:
-    Default: unset
-    Description: The password for the ceilometer service account.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the ceilometer service account.
+    type: string
+    hidden: true
   SnmpdReadonlyUserName:
-    Default: ro_snmp_user
-    Description: The user name for SNMPd with readonly rights running on all Overcloud nodes
-    Type: String
+    default: ro_snmp_user
+    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
+    type: string
   SnmpdReadonlyUserPassword:
-    Default: unset
-    Description: The user password for SNMPd with readonly rights running on all Overcloud nodes
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
+    type: string
+    hidden: true
   CloudName:
-    Default: ''
-    Description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
-    Type: String
+    default: ''
+    description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
+    type: string
   NovaComputeDriver:
-    Default: libvirt.LibvirtDriver
-    Type: String
+    default: libvirt.LibvirtDriver
+    type: string
   NovaComputeLibvirtType:
-    Default: ''
-    Type: String
+    default: ''
+    type: string
   NovaImage:
-    Type: String
-    Default: overcloud-compute
+    type: string
+    default: overcloud-compute
   NovaPassword:
-    Default: unset
-    Description: The password for the nova service account, used by nova-api.
-    Type: String
-    NoEcho: true
+    default: unset
+    description: The password for the nova service account, used by nova-api.
+    type: string
+    hidden: true
   NeutronFlatNetworks:
-    Type: String
-    Default: ''
-    Description: If set, flat networks to configure in neutron plugins.
+    type: string
+    default: 'datacentre'
+    description: |
+      If set, flat networks to configure in neutron plugins. Defaults to
+      'datacentre' to permit external network creation.
   HypervisorNeutronPhysicalBridge:
-    Default: ''
-    Description: An OVS bridge to create on each hypervisor.
-    Type: String
+    default: 'br-ex'
+    description: |
+      An OVS bridge to create on each hypervisor. This defaults to br-ex the
+      same as the control plane nodes, as we have a uniform configuration of
+      the openvswitch agent. Typically should not need to be changed.
+    type: string
   HypervisorNeutronPublicInterface:
-    Default: ''
-    Description: What interface to add to the HypervisorNeutronPhysicalBridge.
-    Type: String
+    default: 'eth0'
+    description: What interface to add to the HypervisorNeutronPhysicalBridge.
+    type: string
   NeutronPublicInterface:
-    Default: eth0
-    Description: What interface to bridge onto br-ex for network nodes.
-    Type: String
+    default: eth0
+    description: What interface to bridge onto br-ex for network nodes.
+    type: string
   NeutronPublicInterfaceDefaultRoute:
-    Default: ''
-    Description: A custom default route for the NeutronPublicInterface.
-    Type: String
+    default: ''
+    description: A custom default route for the NeutronPublicInterface.
+    type: string
   NeutronPublicInterfaceIP:
-    Default: ''
-    Description: A custom IP address to put onto the NeutronPublicInterface.
-    Type: String
+    default: ''
+    description: A custom IP address to put onto the NeutronPublicInterface.
+    type: string
   NeutronPublicInterfaceRawDevice:
-    Default: ''
-    Description: If set, the public interface is a vlan with this device as the raw device.
-    Type: String
+    default: ''
+    description: If set, the public interface is a vlan with this device as the raw device.
+    type: string
   NeutronControlPlaneID:
-    Default: ''
-    Type: String
-    Description: Neutron ID for ctlplane network.
+    default: ''
+    type: string
+    description: Neutron ID for ctlplane network.
   NeutronDnsmasqOptions:
-    Default: 'dhcp-option-force=26,1400'
-    Description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the gre tunnel overhead.
-    Type: String
+    default: 'dhcp-option-force=26,1400'
+    description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the gre tunnel overhead.
+    type: string
   controllerImage:
-    Type: String
-    Default: overcloud-control
+    type: string
+    default: overcloud-control
   NtpServer:
-    Type: String
-    Default: ''
+    type: string
+    default: ''
   RabbitUserName:
-    Default: guest
-    Description: The username for RabbitMQ
-    Type: String
+    default: guest
+    description: The username for RabbitMQ
+    type: string
   RabbitPassword:
-    Default: guest
-    Description: The password for RabbitMQ
-    Type: String
-    NoEcho: true
+    default: guest
+    description: The password for RabbitMQ
+    type: string
+    hidden: true
   RabbitCookieSalt:
-    Type: String
-    Default: unset
-    Description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
+    type: string
+    default: unset
+    description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
   HeatStackDomainAdminPassword:
-    Description: Password for heat_domain_admin user.
-    Type: String
-    Default: ''
-    NoEcho: true
+    description: Password for heat_domain_admin user.
+    type: string
+    default: ''
+    hidden: true
   LiveUpdateUserName:
-    Type: String
-    Description: The live-update username for the undercloud Glance API.
-    Default: ''
+    type: string
+    description: The live-update username for the undercloud Glance API.
+    default: ''
   LiveUpdateTenantName:
-    Type: String
-    Description: The live-update tenant name for the undercloud Glance API.
-    Default: ''
+    type: string
+    description: The live-update tenant name for the undercloud Glance API.
+    default: ''
   LiveUpdateHost:
-    Type: String
-    Description: The IP address for the undercloud Glance API.
-    Default: ''
+    type: string
+    description: The IP address for the undercloud Glance API.
+    default: ''
   LiveUpdatePassword:
-    Type: String
-    Default: ''
-    Description: The live-update password for the undercloud Glance API.
-    NoEcho: true
+    type: string
+    default: ''
+    description: The live-update password for the undercloud Glance API.
+    hidden: true
   LiveUpdateComputeImage:
-    Type: String
-    Description: The image ID for live-updates to the overcloud compute nodes.
-    Default: ''
+    type: string
+    description: The image ID for live-updates to the overcloud compute nodes.
+    default: ''
   MysqlInnodbBufferPoolSize:
-    Description: >
+    description: >
         Specifies the size of the buffer pool in megabytes. Setting to
         zero should be interpreted as "no value" and will defer to the
         lower level default.
-    Type: Number
-    Default: 0
+    type: number
+    default: 0
   ControlVirtualInterface:
-    Default: 'br-ex'
-    Description: Interface where virtual ip will be assigned.
-    Type: String
+    default: 'br-ex'
+    description: Interface where virtual ip will be assigned.
+    type: string
   ControlFixedIPs:
-    Default: []
-    Description: Should be used for arbitrary ips.
-    Type: Json
-Resources:
+    default: []
+    description: Should be used for arbitrary ips.
+    type: json
+  PublicVirtualFixedIPs:
+    default: []
+    description: |
+        Control the IP allocation for the PublicVirtualInterface port. E.g.
+        [{'ip_address':'1.2.3.4'}]
+    type: json
+  PublicVirtualInterface:
+    default: 'br-ex'
+    description: >
+        Specifies the interface where the public-facing virtual ip will be assigned.
+        This should be int_public when a VLAN is being used.
+    type: string
+  PublicVirtualNetwork:
+    default: 'ctlplane'
+    type: string
+    description: >
+        Neutron network to allocate public virtual IP port on.
+  KeystoneCACertificate:
+    default: ''
+    description: Keystone self-signed certificate authority certificate.
+    type: string
+  KeystoneSigningCertificate:
+    default: ''
+    description: Keystone certificate for verifying token validity.
+    type: string
+  KeystoneSigningKey:
+    default: ''
+    description: Keystone key for signing tokens.
+    type: string
+    hidden: true
+  DefaultSignalTransport:
+    default: CFN_SIGNAL
+    description: Transport to use for software-config signals.
+    type: string
+    constraints:
+      - allowed_values: [ CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL ]
+resources:
   ControlVirtualIP:
-    Type: OS::Neutron::Port
-    Properties:
+    type: OS::Neutron::Port
+    properties:
       name: control_virtual_ip
-      network_id: {Ref: NeutronControlPlaneID}
+      network_id: {get_param: NeutronControlPlaneID}
       fixed_ips:
-        Ref: ControlFixedIPs
+        get_param: ControlFixedIPs
+  MysqlClusterUniquePart:
+    type: OS::Heat::RandomString
+    properties:
+      length: 10
+  MysqlRootPassword:
+    type: OS::Heat::RandomString
+    properties:
+      length: 10
+  PublicVirtualIP:
+    type: OS::Neutron::Port
+    properties:
+      name: public_virtual_ip
+      network: {get_param: PublicVirtualNetwork}
+      fixed_ips:
+        get_param: PublicVirtualFixedIPs
   RabbitCookie:
-    Type: OS::Heat::RandomString
-    Properties:
+    type: OS::Heat::RandomString
+    properties:
       length: 20
       salt:
-        Ref: RabbitCookieSalt
-  NovaCompute0Config:
-    Type: FileInclude
+        get_param: RabbitCookieSalt
+  NovaCompute0Deployment:
+    type: FileInclude
     Path: nova-compute-instance.yaml
-    SubKey: Resources.NovaCompute0Deploy
-    Parameters:
-        NovaApiHost: {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
-        KeystoneHost: {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
-        RabbitHost: {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
-        NeutronHost: {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
-        GlanceHost: {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
-        NovaDSN: {"Fn::Join": ['', ['mysql://nova:unset@', {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}, '/nova']]}
-        CeilometerDSN: {"Fn::Join": ['', ['mysql://ceilometer:unset@', {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}, '/ceilometer']]}
-        NeutronDSN: {"Fn::Join": ['', ['mysql://neutron:unset@', {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}, '/neutron']]}
+    SubKey: resources.NovaCompute0Deployment
+    parameters:
+        DefaultSignalTransport:
+            get_param: DefaultSignalTransport
+        NovaApiHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+        KeystoneHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+        NeutronHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+        GlanceHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+        RabbitHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+        NovaDSN:
+          Fn::Join:
+            - ''
+            - - mysql://nova:unset@
+              - &compute_database_host {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+              - /nova
+        NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
+        CeilometerDSN:
+          Fn::Join:
+            - ''
+            - - mysql://ceilometer:unset@
+              - *compute_database_host
+              - /ceilometer
+        NeutronDSN:
+          Fn::Join:
+            - ''
+            - - mysql://neutron:unset@
+              - *compute_database_host
+              - /ovs_neutron
         NeutronNetworkType: "gre"
         NeutronEnableTunnelling: "True"
         NeutronFlatNetworks:
-            Ref: NeutronFlatNetworks
-        NeutronNetworkVLANRanges: ""
+            get_param: NeutronFlatNetworks
+        NeutronNetworkVLANRanges:
+            get_param: NeutronNetworkVLANRanges
         NeutronPhysicalBridge:
-            Ref: HypervisorNeutronPhysicalBridge
+            get_param: HypervisorNeutronPhysicalBridge
         NeutronPublicInterface:
-            Ref: HypervisorNeutronPublicInterface
+            get_param: HypervisorNeutronPublicInterface
         NeutronBridgeMappings:
-            Ref: NeutronBridgeMappings
-        StaticHosts:
-          Fn::Join:
-          - "\n"
-          - - Fn::Join:
-              - "\n"
-              - Merge::Map:
-                  NovaCompute0:
-                    Fn::Join:
-                    - ' '
-                    - - Fn::Select:
-                        - 0
-                        - Fn::Select:
-                          - ctlplane
-                          - Fn::GetAtt:
-                            - NovaCompute0
-                            - networks
-                      - Fn::Select:
-                        - name
-                        - Fn::GetAtt:
-                          - NovaCompute0
-                          - show
-                      - Fn::Join:
-                        - '.'
-                        - - Fn::Select:
-                            - name
-                            - Fn::GetAtt:
-                              - NovaCompute0
-                              - show
-                          - 'novalocal'
-            - Fn::Join:
-              - "\n"
-              - Merge::Map:
-                  controller0:
-                    Fn::Join:
-                    - ' '
-                    - - Fn::Select:
-                        - 0
-                        - Fn::Select:
-                          - ctlplane
-                          - Fn::GetAtt:
-                            - controller0
-                            - networks
-                      - Fn::Select:
-                        - name
-                        - Fn::GetAtt:
-                          - controller0
-                          - show
-                      - Fn::Join:
-                        - '.'
-                        - - Fn::Select:
-                            - name
-                            - Fn::GetAtt:
-                              - controller0
-                              - show
-                          - 'novalocal'
-                      - {Ref: CloudName}
+            get_param: NeutronBridgeMappings
+  NovaCompute0AllNodesDeployment:
+    type: FileInclude
+    Path: nova-compute-instance.yaml
+    SubKey: resources.NovaCompute0AllNodesDeployment
+    parameters:
+        AllNodesConfig: {get_resource: allNodesConfig}
   NovaCompute0Passthrough:
-    Type: OS::Heat::StructuredDeployment
-    Properties:
-      config: {Ref: NovaComputePassthrough}
-      server: {Ref: NovaCompute0}
-      signal_transport: NO_SIGNAL
-      input_values:
-        passthrough_config: {Ref: ExtraConfig}
+    type: FileInclude
+    Path: nova-compute-instance.yaml
+    SubKey: resources.NovaCompute0Passthrough
+    parameters:
+        passthrough_config: {get_param: ExtraConfig}
   NovaCompute0:
-    Type: FileInclude
+    type: FileInclude
     Path: nova-compute-instance.yaml
-    SubKey: Resources.NovaCompute0
+    SubKey: resources.NovaCompute0
   controllerConfig:
-    Type: OS::Heat::StructuredConfig
-    Properties:
+    type: OS::Heat::StructuredConfig
+    properties:
       group: os-apply-config
       config:
-        completion-signal: {get_input: deploy_signal_id}
         admin-password:
-          Ref: AdminPassword
+          get_param: AdminPassword
         admin-token:
-          Ref: AdminToken
+          get_param: AdminToken
         bootstack:
           public_interface_ip:
-            Ref: NeutronPublicInterfaceIP
+            get_param: NeutronPublicInterfaceIP
+        bootstrap_host:
+          bootstrap_nodeid:
+            Fn::Select:
+            - 0
+            - Fn::Select:
+              - 0
+              - Merge::Map:
+                  controller0:
+                  - Fn::Select:
+                    - name
+                    - get_attr:
+                      - controller0
+                      - show
+          nodeid: {get_input: bootstack_nodeid}
+        database:
+          host: &database_host
+            {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
         cinder:
-          db: mysql://cinder:unset@localhost/cinder
+          db:
+            Fn::Join:
+              - ''
+              - - mysql://cinder:unset@
+                - *database_host
+                - /cinder
           volume_size_mb:
-            Ref: CinderLVMLoopDeviceSize
+            get_param: CinderLVMLoopDeviceSize
           service-password:
-            Ref: CinderPassword
+            get_param: CinderPassword
           iscsi-helper:
-            Ref: CinderISCSIHelper
+            get_param: CinderISCSIHelper
         controller-address:
           get_input: controller_host
+        corosync:
+          bindnetaddr: {get_input: controller_host}
+          mcastport: 5577
+          nodes:
+            Merge::Map:
+              controller0:
+                ip: {get_attr: [controller0, networks, ctlplane, 0]}
+        pacemaker:
+          stonith_enabled : false
+          recheck_interval : 5
+          quorum_policy : ignore
         db-password: unset
         glance:
+          registry:
+            host: {get_input: controller_virtual_ip}
           backend: swift
-          db: mysql://glance:unset@localhost/glance
+          db:
+            Fn::Join:
+              - ''
+              - - mysql://glance:unset@
+                - *database_host
+                - /glance
           host:
-            get_input: controller_host
+            get_input: controller_virtual_ip
+          port:
+            get_param: GlancePort
+          protocol:
+            get_param: GlanceProtocol
           service-password:
-            Ref: GlancePassword
+            get_param: GlancePassword
           swift-store-user: service:glance
           swift-store-key:
-            Ref: GlancePassword
+            get_param: GlancePassword
           notifier-strategy:
-            Ref: GlanceNotifierStrategy
+            get_param: GlanceNotifierStrategy
           log-file:
-            Ref: GlanceLogFile
+            get_param: GlanceLogFile
         heat:
           admin_password:
-            Ref: HeatPassword
+            get_param: HeatPassword
           admin_tenant_name: service
           admin_user: heat
           auth_encryption_key: unset___________
-          db: mysql://heat:unset@localhost/heat
-          stack_domain_admin_password: {Ref: HeatStackDomainAdminPassword}
+          db:
+            Fn::Join:
+              - ''
+              - - mysql://heat:unset@
+                - *database_host
+                - /heat
+          stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
           watch_server_url: {get_input: heat.watch_server_url}
           metadata_server_url: {get_input: heat.metadata_server_url}
           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
-        hosts: {get_input: hosts}
+        horizon:
+          caches:
+            memcached:
+              nodes:
+                Merge::Map:
+                  controller0:
+                    {get_attr: [controller0, show, name]}
         keystone:
-          db: mysql://keystone:unset@localhost/keystone
+          db:
+            Fn::Join:
+              - ''
+              - - mysql://keystone:unset@
+                - *database_host
+                - /keystone
           host:
-            get_input: controller_host
+            get_input: controller_virtual_ip
+          ca_certificate: {get_param: KeystoneCACertificate}
+          signing_key: {get_param: KeystoneSigningKey}
+          signing_certificate: {get_param: KeystoneSigningCertificate}
         mysql:
-          innodb_buffer_pool_size: {Ref: MysqlInnodbBufferPoolSize}
+          innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
+          local_bind: true
+          root-password: {get_resource: MysqlRootPassword}
+          nodes:
+            Merge::Map:
+              controller0:
+                ip: {get_attr: [controller0, networks, ctlplane, 0]}
+          cluster_name:
+            Fn::Join:
+              - '-'
+              - - 'tripleo'
+                - {get_resource: MysqlClusterUniquePart}
         neutron:
-          flat-networks: {Ref: NeutronFlatNetworks}
-          host:
-            get_input: controller_host
+          flat-networks: {get_param: NeutronFlatNetworks}
+          host: {get_input: controller_virtual_ip}
           metadata_proxy_shared_secret: unset
           ovs:
             enable_tunneling: 'True'
             local_ip:
               get_input: controller_host
-            bridge_mappings: {Ref: NeutronBridgeMappings}
+            network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
+            bridge_mappings: {get_param: NeutronBridgeMappings}
             public_interface:
-              Ref: NeutronPublicInterface
+              get_param: NeutronPublicInterface
             public_interface_raw_device:
-              Ref: NeutronPublicInterfaceRawDevice
+              get_param: NeutronPublicInterfaceRawDevice
             public_interface_route:
-              Ref: NeutronPublicInterfaceDefaultRoute
+              get_param: NeutronPublicInterfaceDefaultRoute
             physical_bridge: br-ex
             tenant_network_type: gre
-          ovs_db: mysql://neutron:unset@localhost/ovs_neutron?charset=utf8
+          ovs_db:
+            Fn::Join:
+              - ''
+              - - mysql://neutron:unset@
+                - *database_host
+                - /ovs_neutron?charset=utf8
           service-password:
-            Ref: NeutronPassword
+            get_param: NeutronPassword
           dnsmasq-options:
-            Ref: NeutronDnsmasqOptions
+            get_param: NeutronDnsmasqOptions
         ceilometer:
-          db: mysql://ceilometer:unset@localhost/ceilometer
-          metering_secret: {Ref: CeilometerMeteringSecret}
+          db:
+            Fn::Join:
+              - ''
+              - - mysql://ceilometer:unset@
+                - *database_host
+                - /ceilometer
+          metering_secret: {get_param: CeilometerMeteringSecret}
           service-password:
-            Ref: CeilometerPassword
+            get_param: CeilometerPassword
         snmpd:
           export_MIB: UCD-SNMP-MIB
           readonly_user_name:
-            Ref: SnmpdReadonlyUserName
+            get_param: SnmpdReadonlyUserName
           readonly_user_password:
-            Ref: SnmpdReadonlyUserPassword
+            get_param: SnmpdReadonlyUserPassword
         nova:
           compute_driver: libvirt.LibvirtDriver
-          db: mysql://nova:unset@localhost/nova
+          db:
+            Fn::Join:
+              - ''
+              - - mysql://nova:unset@
+                - *database_host
+                - /nova
           default_floating_pool:
             ext-net
-          host:
-            get_input: controller_host
+          host: {get_input: controller_virtual_ip}
           metadata-proxy: true
           service-password:
-            Ref: NovaPassword
+            get_param: NovaPassword
         rabbit:
-          host:
-            get_input: controller_host
+          host: {get_input: controller_virtual_ip}
           username:
-            Ref: RabbitUserName
+            get_param: RabbitUserName
           password:
-            Ref: RabbitPassword
+            get_param: RabbitPassword
           cookie:
-            Fn::GetAtt:
+            get_attr:
             - RabbitCookie
             - value
         ntp:
           servers:
-              - {server: {Ref: NtpServer}, fudge: "stratum 0"}
+              - {server: {get_param: NtpServer}, fudge: "stratum 0"}
+        virtual_interfaces:
+          instances:
+            - vrrp_instance_name: VI_CONTROL
+              virtual_router_id: 51
+              keepalive_interface:
+                get_param: ControlVirtualInterface
+              priority: 101
+              virtual_ips:
+              - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+                interface:
+                  get_param: ControlVirtualInterface
+            - vrrp_instance_name: VI_PUBLIC
+              virtual_router_id: 52
+              keepalive_interface:
+                get_param: PublicVirtualInterface
+              priority: 101
+              virtual_ips:
+              - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
+                interface:
+                  get_param: PublicVirtualInterface
+          vrrp_sync_groups:
+            - name: VG1
+              members:
+                - VI_CONTROL
+                - VI_PUBLIC
         keepalived:
           keepalive_interface:
-            Ref: NeutronPublicInterface
+            get_param: PublicVirtualInterface
           priority: 101
         virtual_ips:
             -
-              ip: {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
+              ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+              interface:
+                get_param: ControlVirtualInterface
+            -
+              ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
               interface:
-                Ref: ControlVirtualInterface
+                get_param: PublicVirtualInterface
+        haproxy:
+          nodes:
+            Merge::Map:
+              controller0:
+                ip: {get_attr: [controller0, networks, ctlplane, 0]}
+                name: {get_attr: [controller0, show, name]}
+          net_binds:
+            - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+          services:
+            - name: keystone_admin
+              port: 35357
+              net_binds: &public_binds
+                - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
+                - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
+            - name: keystone_public
+              port: 5000
+              net_binds: *public_binds
+            - name: horizon
+              port: 80
+              net_binds: *public_binds
+            - name: neutron
+              port: 9696
+              net_binds: *public_binds
+            - name: cinder
+              port: 8776
+              net_binds: *public_binds
+            - name: glance_api
+              port: 9292
+              net_binds: *public_binds
+            - name: glance_registry
+              port: 9191
+              net_binds: *public_binds
+            - name: heat_api
+              port: 8004
+              net_binds: *public_binds
+            - name: heat_cloudwatch
+              port: 8003
+              net_binds: *public_binds
+            - name: heat_cfn
+              port: 8000
+              net_binds: *public_binds
+            - name: mysql
+              port: 3306
+              extra_server_params:
+                - backup
+              options:
+                - timeout client 0
+                - timeout server 0
+            - name: nova_ec2
+              port: 8773
+            - name: nova_osapi
+              port: 8774
+              net_binds: *public_binds
+            - name: nova_metadata
+              port: 8775
+              net_binds: *public_binds
+            - name: ceilometer
+              port: 8777
+              net_binds: *public_binds
+            - name: swift_proxy_server
+              port: 8080
+              net_binds: *public_binds
+            - name: rabbitmq
+              port: 5672
+              options:
+                - timeout client 0
+                - timeout server 0
   controllerPassthrough:
-    Type: OS::Heat::StructuredConfig
-    Properties:
+    type: OS::Heat::StructuredConfig
+    properties:
       group: os-apply-config
       config: {get_input: passthrough_config}
   controller0:
-    Type: OS::Nova::Server
-    Properties:
+    type: OS::Nova::Server
+    properties:
       image:
-        Ref: controllerImage
+        get_param: controllerImage
       image_update_policy:
-        Ref: ImageUpdatePolicy
+        get_param: ImageUpdatePolicy
       flavor:
-        Ref: OvercloudControlFlavor
+        get_param: OvercloudControlFlavor
       key_name:
-        Ref: KeyName
+        get_param: KeyName
+      networks:
+        - network: ctlplane
       user_data_format: SOFTWARE_CONFIG
+  controller0AllNodesDeployment:
+    depends_on: [controller0Deployment,controller0SSLDeployment,controller0Swift,controller0Passthrough]
+    type: OS::Heat::StructuredDeployment
+    properties:
+      signal_transport: {get_param: DefaultSignalTransport}
+      config: {get_resource: allNodesConfig}
+      server: {get_resource: controller0}
   controller0Deployment:
-    Type: OS::Heat::StructuredDeployment
-    Properties:
-      config: {Ref: controllerConfig}
-      server: {Ref: controller0}
+    type: OS::Heat::StructuredDeployment
+    properties:
+      signal_transport: NO_SIGNAL
+      config: {get_resource: controllerConfig}
+      server: {get_resource: controller0}
       input_values:
-        controller_host:
-          Fn::Select:
-            - 0
-            - Fn::Select:
-              - ctlplane
-              - Fn::GetAtt:
-                - controller0
-                - networks
+        bootstack_nodeid: {get_attr: [controller0, show, name]}
+        controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
+        controller_virtual_ip:
+          {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
         heat.watch_server_url:
           Fn::Join:
             - ''
             - - 'http://'
-              - {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
+              - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
               - ':8003'
         heat.metadata_server_url:
           Fn::Join:
             - ''
             - - 'http://'
-              - {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
+              - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
               - ':8000'
         heat.waitcondition_server_url:
           Fn::Join:
             - ''
             - - 'http://'
-              - {'Fn::Select': [ip_address, 'Fn::Select': [0, 'Fn::GetAtt': [ControlVirtualIP, fixed_ips]]]}
+              - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
               - ':8000/v1/waitcondition'
+  allNodesConfig:
+    type: OS::Heat::StructuredConfig
+    properties:
+      config:
+        completion-signal: {get_input: deploy_signal_id}
         hosts:
           Fn::Join:
           - "\n"
@@ -531,25 +769,35 @@ Resources:
                   NovaCompute0:
                     Fn::Join:
                     - ' '
-                    - - Fn::Select:
-                        - 0
-                        - Fn::Select:
-                          - ctlplane
-                          - Fn::GetAtt:
-                            - NovaCompute0
-                            - networks
-                      - Fn::Select:
-                        - name
-                        - Fn::GetAtt:
-                          - NovaCompute0
-                          - show
+                    - - {get_attr: [NovaCompute0, networks, ctlplane, 0]}
+                      - {get_attr: [NovaCompute0, show, name]}
                       - Fn::Join:
                         - '.'
-                        - - Fn::Select:
-                            - name
-                            - Fn::GetAtt:
-                              - NovaCompute0
-                              - show
+                        - - {get_attr: [NovaCompute0, show, name]}
+                          - 'novalocal'
+            - Fn::Join:
+              - "\n"
+              - Merge::Map:
+                  BlockStorage0:
+                    Fn::Join:
+                    - ' '
+                    - - {get_attr: [BlockStorage0, networks, ctlplane, 0]}
+                      - {get_attr: [BlockStorage0, show, name]}
+                      - Fn::Join:
+                        - '.'
+                        - - {get_attr: [BlockStorage0, show, name]}
+                          - 'novalocal'
+            - Fn::Join:
+              - "\n"
+              - Merge::Map:
+                  SwiftStorage0:
+                    Fn::Join:
+                    - ' '
+                    - - {get_attr: [SwiftStorage0, networks, ctlplane, 0]}
+                      - {get_attr: [SwiftStorage0, show, name]}
+                      - Fn::Join:
+                        - '.'
+                        - - {get_attr: [SwiftStorage0, show, name]}
                           - 'novalocal'
             - Fn::Join:
               - "\n"
@@ -557,56 +805,45 @@ Resources:
                   controller0:
                     Fn::Join:
                     - ' '
-                    - - Fn::Select:
-                        - 0
-                        - Fn::Select:
-                          - ctlplane
-                          - Fn::GetAtt:
-                            - controller0
-                            - networks
-                      - Fn::Select:
-                        - name
-                        - Fn::GetAtt:
-                          - controller0
-                          - show
+                    - - {get_attr: [controller0, networks, ctlplane, 0]}
+                      - {get_attr: [controller0, show, name]}
                       - Fn::Join:
                         - '.'
-                        - - Fn::Select:
-                            - name
-                            - Fn::GetAtt:
-                              - controller0
-                              - show
+                        - - {get_attr: [controller0, show, name]}
                           - 'novalocal'
-                      - {Ref: CloudName}
+                      - {get_param: CloudName}
+        rabbit:
+          nodes:
+            Fn::Join:
+              - ','
+              - Merge::Map:
+                  controller0:
+                    {get_attr: [controller0, show, name]}
   controller0SSLDeployment:
-    Type: OS::Heat::StructuredDeployment
-    Properties:
-      config: {Ref: SSLConfig}
-      server: {Ref: controller0}
+    type: OS::Heat::StructuredDeployment
+    properties:
+      config: {get_resource: SSLConfig}
+      server: {get_resource: controller0}
       signal_transport: NO_SIGNAL
       input_values:
-        ssl_certificate: {Ref: SSLCertificate}
-        ssl_key: {Ref: SSLKey}
+        controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
+        ssl_certificate: {get_param: SSLCertificate}
+        ssl_key: {get_param: SSLKey}
+        ssl_ca_certificate: {get_param: SSLCACertificate}
   controller0Passthrough:
-    Type: OS::Heat::StructuredDeployment
-    Properties:
-      config: {Ref: controllerPassthrough}
-      server: {Ref: controller0}
+    type: OS::Heat::StructuredDeployment
+    properties:
+      config: {get_resource: controllerPassthrough}
+      server: {get_resource: controller0}
       signal_transport: NO_SIGNAL
       input_values:
-        passthrough_config: {Ref: ExtraConfig}
-Outputs:
+        passthrough_config: {get_param: ExtraConfig}
+outputs:
   KeystoneURL:
-    Description: URL for the Overcloud Keystone service
-    Value:
+    description: URL for the Overcloud Keystone service
+    value:
       Fn::Join:
       - ''
       - - http://
-        - Fn::Select:
-          - ip_address
-          - Fn::Select:
-            - 0
-            - Fn::GetAtt:
-              - ControlVirtualIP
-              - fixed_ips
+        - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
         - :5000/v2.0/