Add MysqlNoBracketsInternal to enable-tls.yaml
[apex-tripleo-heat-templates.git] / overcloud.yaml
1 heat_template_version: 2016-04-08
2
3 description: >
4   Deploy an OpenStack environment, consisting of several node types (roles),
5   Controller, Compute, BlockStorage, SwiftStorage and CephStorage.  The Storage
6   roles enable independent scaling of the storage components, but the minimal
7   deployment is one Controller and one Compute node.
8
9
10 # TODO(shadower): we should probably use the parameter groups to put
11 # some order in here.
12 parameters:
13
14   # Common parameters (not specific to a role)
15   AdminPassword:
16     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
17     type: string
18     hidden: true
19   AodhPassword:
20     description: The password for the aodh services.
21     type: string
22     hidden: true
23   CinderEnableNfsBackend:
24     default: false
25     description: Whether to enable or not the NFS backend for Cinder
26     type: boolean
27   CinderEnableRbdBackend:
28     default: false
29     description: Whether to enable or not the Rbd backend for Cinder
30     type: boolean
31   CloudName:
32     default: overcloud
33     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
34     type: string
35   ControlFixedIPs:
36     default: []
37     description: Should be used for arbitrary ips.
38     type: json
39   CorosyncIPv6:
40     default: false
41     description: Enable IPv6 in Corosync
42     type: boolean
43   Debug:
44     default: ''
45     description: Set to True to enable debugging on all services.
46     type: string
47   HAProxySyslogAddress:
48     default: /dev/log
49     description: Syslog address where HAproxy will send its log
50     type: string
51   ImageUpdatePolicy:
52     default: 'REBUILD_PRESERVE_EPHEMERAL'
53     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
54     type: string
55   InternalApiVirtualFixedIPs:
56     default: []
57     description: >
58         Control the IP allocation for the InternalApiVirtualInterface port. E.g.
59         [{'ip_address':'1.2.3.4'}]
60     type: json
61   KeyName:
62     default: default
63     description: Name of an existing Nova key pair to enable SSH access to the instances
64     type: string
65     constraints:
66       - custom_constraint: nova.keypair
67   MemcachedIPv6:
68     default: false
69     description: Enable IPv6 features in Memcached.
70     type: boolean
71   NeutronControlPlaneID:
72     default: 'ctlplane'
73     type: string
74     description: Neutron ID or name for ctlplane network.
75   NeutronPassword:
76     description: The password for the neutron service account, used by neutron agents.
77     type: string
78     hidden: true
79   NeutronPublicInterface:
80     default: nic1
81     description: What interface to bridge onto br-ex for network nodes.
82     type: string
83   NovaIPv6:
84     default: false
85     description: Enable IPv6 features in Nova
86     type: boolean
87   NovaPassword:
88     description: The password for the nova service account, used by nova-api.
89     type: string
90     hidden: true
91   PublicVirtualFixedIPs:
92     default: []
93     description: >
94         Control the IP allocation for the PublicVirtualInterface port. E.g.
95         [{'ip_address':'1.2.3.4'}]
96     type: json
97   RabbitCookieSalt:
98     type: string
99     default: unset
100     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
101   RabbitUserName:
102     default: guest
103     description: The username for RabbitMQ
104     type: string
105   RabbitPassword:
106     description: The password for RabbitMQ
107     type: string
108     hidden: true
109   RabbitClientUseSSL:
110     default: false
111     description: >
112         Rabbit client subscriber parameter to specify
113         an SSL connection to the RabbitMQ host.
114     type: string
115   RabbitClientPort:
116     default: 5672
117     description: Set rabbit subscriber port, change this if using SSL
118     type: number
119   RedisPassword:
120     description: The password for Redis
121     type: string
122     hidden: true
123   StorageVirtualFixedIPs:
124     default: []
125     description: >
126         Control the IP allocation for the StorageVirtualInterface port. E.g.
127         [{'ip_address':'1.2.3.4'}]
128     type: json
129   StorageMgmtVirtualFixedIPs:
130     default: []
131     description: >
132         Control the IP allocation for the StorageMgmgVirtualInterface port. E.g.
133         [{'ip_address':'1.2.3.4'}]
134     type: json
135   CloudDomain:
136     default: 'localdomain'
137     type: string
138     description: >
139       The DNS domain used for the hosts. This should match the dhcp_domain
140       configured in the Undercloud neutron. Defaults to localdomain.
141   ServerMetadata:
142     default: {}
143     description: >
144       Extra properties or metadata passed to Nova for the created nodes in
145       the overcloud. It's accessible via the Nova metadata API.
146     type: json
147
148   # Controller-specific params
149   ControllerCount:
150     type: number
151     default: 1
152     constraints:
153       - range: {min: 1}
154   controllerExtraConfig:
155     default: {}
156     description: |
157       Deprecated. Use ControllerExtraConfig via parameter_defaults instead.
158     type: json
159   controllerImage:
160     type: string
161     default: overcloud-full
162     constraints:
163       - custom_constraint: glance.image
164   OvercloudControlFlavor:
165     description: Flavor for control nodes to request when deploying.
166     default: baremetal
167     type: string
168     constraints:
169       - custom_constraint: nova.flavor
170   ControlVirtualInterface:
171     default: 'br-ex'
172     description: Interface where virtual ip will be assigned.
173     type: string
174   EnableFencing:
175     default: false
176     description: Whether to enable fencing in Pacemaker or not.
177     type: boolean
178   EnableGalera:
179     default: true
180     description: Whether to use Galera instead of regular MariaDB.
181     type: boolean
182   ControllerSchedulerHints:
183     type: json
184     description: Optional scheduler hints to pass to nova
185     default: {}
186   ExtraConfig:
187     default: {}
188     description: |
189       Additional configuration to inject into the cluster. The format required
190       may be implementation specific, e.g puppet hieradata.  Any role specific
191       ExtraConfig, e.g controllerExtraConfig takes precedence over ExtraConfig.
192     type: json
193   FencingConfig:
194     default: {}
195     description: |
196       Pacemaker fencing configuration. The JSON should have
197       the following structure:
198         {
199           "devices": [
200             {
201               "agent": "AGENT_NAME",
202               "host_mac": "HOST_MAC_ADDRESS",
203               "params": {"PARAM_NAME": "PARAM_VALUE"}
204             }
205           ]
206         }
207       For instance:
208         {
209           "devices": [
210             {
211               "agent": "fence_xvm",
212               "host_mac": "52:54:00:aa:bb:cc",
213               "params": {
214                 "multicast_address": "225.0.0.12",
215                 "port": "baremetal_0",
216                 "manage_fw": true,
217                 "manage_key_file": true,
218                 "key_file": "/etc/fence_xvm.key",
219                 "key_file_password": "abcdef"
220               }
221             }
222           ]
223         }
224     type: json
225     type: string
226     hidden: true
227   InstanceNameTemplate:
228     default: 'instance-%08x'
229     description: Template string to be used to generate instance names
230     type: string
231   ManageFirewall:
232     default: true
233     description: Whether to manage IPtables rules.
234     type: boolean
235   PurgeFirewallRules:
236     default: false
237     description: Whether IPtables rules should be purged before setting up the ones.
238     type: boolean
239   MysqlInnodbBufferPoolSize:
240     description: >
241         Specifies the size of the buffer pool in megabytes. Setting to
242         zero should be interpreted as "no value" and will defer to the
243         lower level default.
244     type: number
245     default: 0
246   MysqlMaxConnections:
247     description: Configures MySQL max_connections config setting
248     type: number
249     default: 4096
250   PublicVirtualInterface:
251     default: 'br-ex'
252     description: >
253         Specifies the interface where the public-facing virtual ip will be assigned.
254         This should be int_public when a VLAN is being used.
255     type: string
256   SwiftHashSuffix:
257     description: A random string to be used as a salt when hashing to determine mappings in the ring.
258     type: string
259     hidden: true
260   SwiftMinPartHours:
261     type: number
262     default: 1
263     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
264   SwiftPartPower:
265     default: 10
266     description: Partition Power to use when building Swift rings
267     type: number
268   SwiftReplicas:
269     type: number
270     default: 3
271     description: How many replicas to use in the swift rings.
272
273 # Compute-specific params
274   ComputeCount:
275     type: number
276     default: 1
277   HypervisorNeutronPhysicalBridge:
278     default: 'br-ex'
279     description: >
280       An OVS bridge to create on each hypervisor. This defaults to br-ex the
281       same as the control plane nodes, as we have a uniform configuration of
282       the openvswitch agent. Typically should not need to be changed.
283     type: string
284   HypervisorNeutronPublicInterface:
285     default: nic1
286     description: What interface to add to the HypervisorNeutronPhysicalBridge.
287     type: string
288   NovaComputeDriver:
289     type: string
290     default: libvirt.LibvirtDriver
291   NovaComputeExtraConfig:
292     default: {}
293     description: |
294       NovaCompute specific configuration to inject into the cluster. Same
295       structure as ExtraConfig.
296     type: json
297   NovaComputeLibvirtType:
298     default: kvm
299     type: string
300   NovaComputeLibvirtVifDriver:
301     default: ''
302     description: Libvirt VIF driver configuration for the network
303     type: string
304   NovaComputeSchedulerHints:
305     type: json
306     description: Optional scheduler hints to pass to nova
307     default: {}
308   NovaEnableRbdBackend:
309     default: false
310     description: Whether to enable or not the Rbd backend for Nova
311     type: boolean
312   NovaImage:
313     type: string
314     default: overcloud-full
315     constraints:
316       - custom_constraint: glance.image
317   NovaOVSBridge:
318     default: 'br-int'
319     description: Name of integration bridge used by Open vSwitch
320     type: string
321   NovaSecurityGroupAPI:
322     default: 'neutron'
323     description: The full class name of the security API class
324     type: string
325   OvercloudComputeFlavor:
326     description: Use this flavor
327     default: baremetal
328     type: string
329     constraints:
330       - custom_constraint: nova.flavor
331   ServiceNetMap:
332     default:
333       NeutronTenantNetwork: tenant
334       CeilometerApiNetwork: internal_api
335       AodhApiNetwork: internal_api
336       GnocchiApiNetwork: internal_api
337       MongoDbNetwork: internal_api
338       CinderApiNetwork: internal_api
339       CinderIscsiNetwork: storage
340       GlanceApiNetwork: storage
341       GlanceRegistryNetwork: internal_api
342       IronicApiNetwork: internal_api
343       KeystoneAdminApiNetwork: ctlplane # allows undercloud to config endpoints
344       KeystonePublicApiNetwork: internal_api
345       NeutronApiNetwork: internal_api
346       HeatApiNetwork: internal_api
347       NovaApiNetwork: internal_api
348       NovaMetadataNetwork: internal_api
349       NovaVncProxyNetwork: internal_api
350       SwiftMgmtNetwork: storage_mgmt
351       SwiftProxyNetwork: storage
352       SaharaApiNetwork: internal_api
353       HorizonNetwork: internal_api
354       MemcachedNetwork: internal_api
355       RabbitMqNetwork: internal_api
356       RedisNetwork: internal_api
357       MysqlNetwork: internal_api
358       CephClusterNetwork: storage_mgmt
359       CephPublicNetwork: storage
360       ControllerHostnameResolveNetwork: internal_api
361       ComputeHostnameResolveNetwork: internal_api
362       BlockStorageHostnameResolveNetwork: internal_api
363       ObjectStorageHostnameResolveNetwork: internal_api
364       CephStorageHostnameResolveNetwork: storage
365     description: Mapping of service_name -> network name. Typically set
366                  via parameter_defaults in the resource registry.
367     type: json
368
369   ControllerServices:
370     default:
371       - OS::TripleO::Services::CephMon
372       - OS::TripleO::Services::CephExternal
373       - OS::TripleO::Services::CinderApi
374       - OS::TripleO::Services::CinderScheduler
375       - OS::TripleO::Services::CinderVolume
376       - OS::TripleO::Services::Kernel
377       - OS::TripleO::Services::Keystone
378       - OS::TripleO::Services::GlanceApi
379       - OS::TripleO::Services::GlanceRegistry
380       - OS::TripleO::Services::HeatApi
381       - OS::TripleO::Services::HeatApiCfn
382       - OS::TripleO::Services::HeatApiCloudwatch
383       - OS::TripleO::Services::HeatEngine
384       - OS::TripleO::Services::NeutronDhcpAgent
385       - OS::TripleO::Services::NeutronL3Agent
386       - OS::TripleO::Services::NeutronMetadataAgent
387       - OS::TripleO::Services::NeutronServer
388       - OS::TripleO::Services::NeutronCorePlugin
389       - OS::TripleO::Services::NeutronOvsAgent
390       - OS::TripleO::Services::RabbitMQ
391       - OS::TripleO::Services::HAproxy
392       - OS::TripleO::Services::Keepalived
393       - OS::TripleO::Services::Memcached
394       - OS::TripleO::Services::Pacemaker
395       - OS::TripleO::Services::Redis
396       - OS::TripleO::Services::NovaConductor
397       - OS::TripleO::Services::MongoDb
398       - OS::TripleO::Services::NovaApi
399       - OS::TripleO::Services::NovaScheduler
400       - OS::TripleO::Services::NovaConsoleauth
401       - OS::TripleO::Services::NovaVncproxy
402       - OS::TripleO::Services::Ntp
403       - OS::TripleO::Services::SwiftProxy
404       - OS::TripleO::Services::SwiftStorage
405       - OS::TripleO::Services::Snmp
406       - OS::TripleO::Services::Timezone
407       - OS::TripleO::Services::CeilometerApi
408       - OS::TripleO::Services::CeilometerCollector
409       - OS::TripleO::Services::CeilometerExpirer
410       - OS::TripleO::Services::CeilometerAgentCentral
411       - OS::TripleO::Services::CeilometerAgentNotification
412       - OS::TripleO::Services::Horizon
413       - OS::TripleO::Services::GnocchiApi
414       - OS::TripleO::Services::GnocchiMetricd
415       - OS::TripleO::Services::GnocchiStatsd
416
417     description: A list of service resources (configured in the Heat
418                  resource_registry) which represent nested stacks
419                  for each service that should get installed on the Controllers.
420     type: comma_delimited_list
421
422   ComputeServices:
423     default:
424       - OS::TripleO::Services::CephClient
425       - OS::TripleO::Services::CephExternal
426       - OS::TripleO::Services::Timezone
427       - OS::TripleO::Services::Ntp
428       - OS::TripleO::Services::Snmp
429       - OS::TripleO::Services::NovaCompute
430       - OS::TripleO::Services::NovaLibvirt
431       - OS::TripleO::Services::Kernel
432       - OS::TripleO::Services::ComputeNeutronCorePlugin
433       - OS::TripleO::Services::ComputeNeutronOvsAgent
434       - OS::TripleO::Services::ComputeCeilometerAgent
435     description: A list of service resources (configured in the Heat
436                  resource_registry) which represent nested stacks
437                  for each service that should get installed on the Compute Nodes.
438     type: comma_delimited_list
439
440 # Block storage specific parameters
441   BlockStorageCount:
442     type: number
443     default: 0
444   BlockStorageImage:
445     default: overcloud-full
446     type: string
447   OvercloudBlockStorageFlavor:
448     description: Flavor for block storage nodes to request when deploying.
449     default: baremetal
450     type: string
451     constraints:
452       - custom_constraint: nova.flavor
453   BlockStorageExtraConfig:
454     default: {}
455     description: |
456       BlockStorage specific configuration to inject into the cluster. Same
457       structure as ExtraConfig.
458     type: json
459   BlockStorageSchedulerHints:
460     type: json
461     description: Optional scheduler hints to pass to nova
462     default: {}
463   BlockStorageServices:
464     default:
465       - OS::TripleO::Services::CinderVolume
466       - OS::TripleO::Services::Kernel
467       - OS::TripleO::Services::Ntp
468       - OS::TripleO::Services::Timezone
469       - OS::TripleO::Services::Snmp
470     description: A list of service resources (configured in the Heat
471                  resource_registry) which represent nested stacks
472                  for each service that should get installed on the BlockStorage nodes.
473     type: comma_delimited_list
474
475 # Object storage specific parameters
476   ObjectStorageCount:
477     type: number
478     default: 0
479   OvercloudSwiftStorageFlavor:
480     description: Flavor for Swift storage nodes to request when deploying.
481     default: baremetal
482     type: string
483     constraints:
484       - custom_constraint: nova.flavor
485   SwiftStorageImage:
486     default: overcloud-full
487     type: string
488   ObjectStorageExtraConfig:
489     default: {}
490     description: |
491       ObjectStorage specific configuration to inject into the cluster. Same
492       structure as ExtraConfig.
493     type: json
494   ObjectStorageSchedulerHints:
495     type: json
496     description: Optional scheduler hints to pass to nova
497     default: {}
498   ObjectStorageServices:
499     default:
500       - OS::TripleO::Services::Kernel
501       - OS::TripleO::Services::Ntp
502       - OS::TripleO::Services::SwiftStorage
503       - OS::TripleO::Services::Snmp
504       - OS::TripleO::Services::Timezone
505     description: A list of service resources (configured in the Heat
506                  resource_registry) which represent nested stacks
507                  for each service that should get installed on the ObjectStorage nodes.
508                  Note this role currently only supports steps 2, 3 and 4 configuration.
509     type: comma_delimited_list
510
511
512 # Ceph storage specific parameters
513   CephStorageCount:
514     type: number
515     default: 0
516   CephStorageImage:
517     default: overcloud-full
518     type: string
519   OvercloudCephStorageFlavor:
520     default: baremetal
521     description: Flavor for Ceph storage nodes to request when deploying.
522     type: string
523     constraints:
524       - custom_constraint: nova.flavor
525   CephStorageExtraConfig:
526     default: {}
527     description: |
528       CephStorage specific configuration to inject into the cluster. Same
529       structure as ExtraConfig.
530     type: json
531   CephStorageSchedulerHints:
532     type: json
533     description: Optional scheduler hints to pass to nova
534     default: {}
535   CephStorageServices:
536     default:
537       - OS::TripleO::Services::CephOSD
538       - OS::TripleO::Services::Kernel
539       - OS::TripleO::Services::Ntp
540       - OS::TripleO::Services::Timezone
541     description: A list of service resources (configured in the Heat
542                  resource_registry) which represent nested stacks
543                  for each service that should get installed on the CephStorage nodes.
544     type: comma_delimited_list
545
546   # Hostname format for each role
547   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
548   # and %stackname% is replaced with OS::stack_name in the template below.
549   # If you want to use the heat generated names, pass '' (empty string).
550   ControllerHostnameFormat:
551     type: string
552     description: Format for Controller node hostnames
553     default: '%stackname%-controller-%index%'
554   ComputeHostnameFormat:
555     type: string
556     description: Format for Compute node hostnames
557     default: '%stackname%-novacompute-%index%'
558   BlockStorageHostnameFormat:
559     type: string
560     description: Format for BlockStorage node hostnames
561     default: '%stackname%-blockstorage-%index%'
562   ObjectStorageHostnameFormat:
563     type: string
564     description: Format for SwiftStorage node hostnames
565     default: '%stackname%-objectstorage-%index%'
566   CephStorageHostnameFormat:
567     type: string
568     description: Format for CephStorage node hostnames
569     default: '%stackname%-cephstorage-%index%'
570
571   # Identifiers to trigger tasks on nodes
572   UpdateIdentifier:
573     default: ''
574     type: string
575     description: >
576       Setting to a previously unused value during stack-update will trigger
577       package update on all nodes
578   DeployIdentifier:
579     default: ''
580     type: string
581     description: >
582       Setting this to a unique value will re-run any deployment tasks which
583       perform configuration on a Heat stack-update.
584
585   # If you want to remove a specific node from a resource group, you can pass
586   # the node name or id as a <Group>RemovalPolicies parameter, for example:
587   # ComputeRemovalPolicies: [{'resource_list': ['0']}]
588   ControllerRemovalPolicies:
589     default: []
590     type: json
591     description: >
592       List of resources to be removed from ControllerResourceGroup when
593       doing an update which requires removal of specific resources.
594   ComputeRemovalPolicies:
595     default: []
596     type: json
597     description: >
598       List of resources to be removed from ComputeResourceGroup when
599       doing an update which requires removal of specific resources.
600   BlockStorageRemovalPolicies:
601     default: []
602     type: json
603     description: >
604       List of resources to be removed from BlockStorageResourceGroup when
605       doing an update which requires removal of specific resources.
606   ObjectStorageRemovalPolicies:
607     default: []
608     type: json
609     description: >
610       List of resources to be removed from ObjectStorageResourceGroup when
611       doing an update which requires removal of specific resources.
612   CephStorageRemovalPolicies:
613     default: []
614     type: json
615     description: >
616       List of resources to be removed from CephStorageResourceGroup when
617       doing an update which requires removal of specific resources.
618
619 parameter_groups:
620 - label: deprecated
621   description: Do not use deprecated params, they will be removed.
622   parameters:
623   - controllerExtraConfig
624
625
626 resources:
627
628   HeatAuthEncryptionKey:
629     type: OS::Heat::RandomString
630
631   PcsdPassword:
632     type: OS::Heat::RandomString
633     properties:
634       length: 16
635
636   HorizonSecret:
637     type: OS::Heat::RandomString
638     properties:
639       length: 10
640
641   EndpointMap:
642     type: OS::TripleO::EndpointMap
643     properties:
644       CloudName: {get_param: CloudName}
645       CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
646       AodhApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
647       CinderApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
648       GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
649       GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
650       GnocchiApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
651       HeatApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
652       IronicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
653       KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
654       KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
655       MysqlVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
656       MysqlNoBracketsVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
657       NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
658       NovaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
659       SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
660       SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
661       PublicVirtualIP: {get_attr: [VipMap, net_ip_uri_map, external]}
662
663   ControllerServiceChain:
664     type: OS::TripleO::Services
665     properties:
666       Services: {get_param: ControllerServices}
667       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
668
669   Controller:
670     type: OS::Heat::ResourceGroup
671     depends_on: Networks
672     properties:
673       count: {get_param: ControllerCount}
674       removal_policies: {get_param: ControllerRemovalPolicies}
675       resource_def:
676         type: OS::TripleO::Controller
677         properties:
678           AdminPassword: {get_param: AdminPassword}
679           AodhPassword: {get_param: AodhPassword}
680           CloudDomain: {get_param: CloudDomain}
681           ControlVirtualInterface: {get_param: ControlVirtualInterface}
682           controllerExtraConfig: {get_param: controllerExtraConfig}
683           CorosyncIPv6: {get_param: CorosyncIPv6}
684           Debug: {get_param: Debug}
685           EnableFencing: {get_param: EnableFencing}
686           ManageFirewall: {get_param: ManageFirewall}
687           PurgeFirewallRules: {get_param: PurgeFirewallRules}
688           EnableGalera: {get_param: EnableGalera}
689           ExtraConfig: {get_param: ExtraConfig}
690           FencingConfig: {get_param: FencingConfig}
691           Flavor: {get_param: OvercloudControlFlavor}
692           HAProxySyslogAddress: {get_param: HAProxySyslogAddress}
693           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
694           HorizonSecret: {get_resource: HorizonSecret}
695           Image: {get_param: controllerImage}
696           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
697           InstanceNameTemplate: {get_param: InstanceNameTemplate}
698           KeyName: {get_param: KeyName}
699           MemcachedIPv6: {get_param: MemcachedIPv6}
700           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
701           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
702           MysqlMaxConnections: {get_param: MysqlMaxConnections}
703           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
704           NeutronPublicInterface: {get_param: NeutronPublicInterface}
705           NeutronPassword: {get_param: NeutronPassword}
706           NovaIPv6: {get_param: NovaIPv6}
707           NovaPassword: {get_param: NovaPassword}
708           PcsdPassword: {get_resource: PcsdPassword}
709           PublicVirtualInterface: {get_param: PublicVirtualInterface}
710           RabbitPassword: {get_param: RabbitPassword}
711           RabbitUserName: {get_param: RabbitUserName}
712           RabbitCookie: {get_attr: [RabbitCookie, value]}
713           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
714           RabbitClientPort: {get_param: RabbitClientPort}
715           RedisPassword: {get_param: RedisPassword}
716           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
717           RedisVirtualIPUri: {get_attr: [RedisVirtualIP, ip_address_uri]}
718           SwiftHashSuffix: {get_param: SwiftHashSuffix}
719           SwiftMinPartHours: {get_param: SwiftMinPartHours}
720           SwiftPartPower: {get_param: SwiftPartPower}
721           SwiftReplicas: { get_param: SwiftReplicas}
722           ServiceNetMap: {get_param: ServiceNetMap}
723           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
724           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
725           UpdateIdentifier: {get_param: UpdateIdentifier}
726           Hostname:
727             str_replace:
728               template: {get_param: ControllerHostnameFormat}
729               params:
730                 '%stackname%': {get_param: 'OS::stack_name'}
731           NodeIndex: '%index%'
732           ServerMetadata: {get_param: ServerMetadata}
733           SchedulerHints: {get_param: ControllerSchedulerHints}
734           ServiceConfigSettings: {get_attr: [ControllerServiceChain, role_data, config_settings]}
735
736   ComputeServiceChain:
737
738     type: OS::TripleO::Services
739     properties:
740       Services: {get_param: ComputeServices}
741       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
742
743   Compute:
744     type: OS::Heat::ResourceGroup
745     depends_on: Networks
746     properties:
747       count: {get_param: ComputeCount}
748       removal_policies: {get_param: ComputeRemovalPolicies}
749       resource_def:
750         type: OS::TripleO::Compute
751         properties:
752           AdminPassword: {get_param: AdminPassword}
753           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
754           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
755           Debug: {get_param: Debug}
756           ExtraConfig: {get_param: ExtraConfig}
757           Flavor: {get_param: OvercloudComputeFlavor}
758           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
759           Image: {get_param: NovaImage}
760           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
761           KeyName: {get_param: KeyName}
762           KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
763           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
764           NeutronPassword: {get_param: NeutronPassword}
765           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
766           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
767           # L3 HA and Failover is not relevant for Computes, should be removed
768           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
769           NovaComputeDriver: {get_param: NovaComputeDriver}
770           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
771           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
772           NovaComputeLibvirtVifDriver: {get_param: NovaComputeLibvirtVifDriver}
773           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
774           NovaIPv6: {get_param: NovaIPv6}
775           NovaPublicIP: {get_attr: [VipMap, net_ip_map, external]}
776           NovaPassword: {get_param: NovaPassword}
777           NovaOVSBridge: {get_param: NovaOVSBridge}
778           NovaSecurityGroupAPI: {get_param: NovaSecurityGroupAPI}
779           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
780           RabbitPassword: {get_param: RabbitPassword}
781           RabbitUserName: {get_param: RabbitUserName}
782           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
783           RabbitClientPort: {get_param: RabbitClientPort}
784           ServiceNetMap: {get_param: ServiceNetMap}
785           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
786           UpdateIdentifier: {get_param: UpdateIdentifier}
787           Hostname:
788             str_replace:
789               template: {get_param: ComputeHostnameFormat}
790               params:
791                 '%stackname%': {get_param: 'OS::stack_name'}
792           CloudDomain: {get_param: CloudDomain}
793           ServerMetadata: {get_param: ServerMetadata}
794           SchedulerHints: {get_param: NovaComputeSchedulerHints}
795           NodeIndex: '%index%'
796           ServiceConfigSettings: {get_attr: [ComputeServiceChain, role_data, config_settings]}
797
798   BlockStorageServiceChain:
799     type: OS::TripleO::Services
800     properties:
801       Services: {get_param: BlockStorageServices}
802       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
803
804   BlockStorage:
805     type: OS::Heat::ResourceGroup
806     depends_on: Networks
807     properties:
808       count: {get_param: BlockStorageCount}
809       removal_policies: {get_param: BlockStorageRemovalPolicies}
810       resource_def:
811         type: OS::TripleO::BlockStorage
812         properties:
813           Image: {get_param: BlockStorageImage}
814           KeyName: {get_param: KeyName}
815           Flavor: {get_param: OvercloudBlockStorageFlavor}
816           UpdateIdentifier: {get_param: UpdateIdentifier}
817           Hostname:
818             str_replace:
819               template: {get_param: BlockStorageHostnameFormat}
820               params:
821                 '%stackname%': {get_param: 'OS::stack_name'}
822           ServiceNetMap: {get_param: ServiceNetMap}
823           ExtraConfig: {get_param: ExtraConfig}
824           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
825           CloudDomain: {get_param: CloudDomain}
826           ServerMetadata: {get_param: ServerMetadata}
827           SchedulerHints: {get_param: BlockStorageSchedulerHints}
828           NodeIndex: '%index%'
829           ServiceConfigSettings: {get_attr: [BlockStorageServiceChain, role_data, config_settings]}
830
831   ObjectStorageServiceChain:
832     type: OS::TripleO::Services
833     properties:
834       Services: {get_param: ObjectStorageServices}
835       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
836
837   ObjectStorage:
838     type: OS::Heat::ResourceGroup
839     depends_on: Networks
840     properties:
841       count: {get_param: ObjectStorageCount}
842       removal_policies: {get_param: ObjectStorageRemovalPolicies}
843       resource_def:
844         type: OS::TripleO::ObjectStorage
845         properties:
846           KeyName: {get_param: KeyName}
847           Flavor: {get_param: OvercloudSwiftStorageFlavor}
848           HashSuffix: {get_param: SwiftHashSuffix}
849           MinPartHours: {get_param: SwiftMinPartHours}
850           PartPower: {get_param: SwiftPartPower}
851           Image: {get_param: SwiftStorageImage}
852           Replicas: { get_param: SwiftReplicas}
853           UpdateIdentifier: {get_param: UpdateIdentifier}
854           ServiceNetMap: {get_param: ServiceNetMap}
855           Hostname:
856             str_replace:
857               template: {get_param: ObjectStorageHostnameFormat}
858               params:
859                 '%stackname%': {get_param: 'OS::stack_name'}
860           ExtraConfig: {get_param: ExtraConfig}
861           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
862           CloudDomain: {get_param: CloudDomain}
863           ServerMetadata: {get_param: ServerMetadata}
864           SchedulerHints: {get_param: ObjectStorageSchedulerHints}
865           NodeIndex: '%index%'
866           ServiceConfigSettings: {get_attr: [ObjectStorageServiceChain, role_data, config_settings]}
867
868   CephStorageServiceChain:
869     type: OS::TripleO::Services
870     properties:
871       Services: {get_param: CephStorageServices}
872       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
873
874   CephStorage:
875     type: OS::Heat::ResourceGroup
876     depends_on: Networks
877     properties:
878       count: {get_param: CephStorageCount}
879       removal_policies: {get_param: CephStorageRemovalPolicies}
880       resource_def:
881         type: OS::TripleO::CephStorage
882         properties:
883           Image: {get_param: CephStorageImage}
884           KeyName: {get_param: KeyName}
885           Flavor: {get_param: OvercloudCephStorageFlavor}
886           ServiceNetMap: {get_param: ServiceNetMap}
887           UpdateIdentifier: {get_param: UpdateIdentifier}
888           Hostname:
889             str_replace:
890               template: {get_param: CephStorageHostnameFormat}
891               params:
892                 '%stackname%': {get_param: 'OS::stack_name'}
893           ExtraConfig: {get_param: ExtraConfig}
894           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
895           CloudDomain: {get_param: CloudDomain}
896           ServerMetadata: {get_param: ServerMetadata}
897           SchedulerHints: {get_param: CephStorageSchedulerHints}
898           NodeIndex: '%index%'
899           ServiceConfigSettings: {get_attr: [CephStorageServiceChain, role_data, config_settings]}
900
901   ControllerIpListMap:
902     type: OS::TripleO::Network::Ports::NetIpListMap
903     properties:
904       ControlPlaneIpList: {get_attr: [Controller, ip_address]}
905       ExternalIpList: {get_attr: [Controller, external_ip_address]}
906       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
907       StorageIpList: {get_attr: [Controller, storage_ip_address]}
908       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
909       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
910       ManagementIpList: {get_attr: [Controller, management_ip_address]}
911
912   allNodesConfig:
913     type: OS::TripleO::AllNodes::SoftwareConfig
914     properties:
915       compute_hosts: {get_attr: [Compute, hosts_entry]}
916       controller_hosts: {get_attr: [Controller, hosts_entry]}
917       controller_ips: {get_attr: [Controller, ip_address]}
918       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
919       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
920       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
921       controller_names: {get_attr: [Controller, hostname]}
922       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
923       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
924       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
925       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
926       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
927       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
928       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
929       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
930       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
931       aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
932       gnocchi_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
933       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
934       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
935       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
936       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
937       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
938       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
939       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
940       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
941       sahara_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
942       ironic_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
943       ceph_mon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
944       ceph_mon_node_names: {get_attr: [Controller, hostname]}
945       DeployIdentifier: {get_param: DeployIdentifier}
946       UpdateIdentifier: {get_param: UpdateIdentifier}
947
948   MysqlRootPassword:
949     type: OS::Heat::RandomString
950     properties:
951       length: 10
952
953   MysqlClusterUniquePart:
954     type: OS::Heat::RandomString
955     properties:
956       length: 10
957
958   RabbitCookie:
959     type: OS::Heat::RandomString
960     properties:
961       length: 20
962       salt: {get_param: RabbitCookieSalt}
963
964   # creates the network architecture
965   Networks:
966     type: OS::TripleO::Network
967
968   ControlVirtualIP:
969     type: OS::Neutron::Port
970     depends_on: Networks
971     properties:
972       name: control_virtual_ip
973       network: {get_param: NeutronControlPlaneID}
974       fixed_ips: {get_param: ControlFixedIPs}
975       replacement_policy: AUTO
976
977   RedisVirtualIP:
978     depends_on: Networks
979     type: OS::TripleO::Network::Ports::RedisVipPort
980     properties:
981       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
982       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
983       PortName: redis_virtual_ip
984       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
985       ServiceName: redis
986
987   # The public VIP is on the External net, falls back to ctlplane
988   PublicVirtualIP:
989     depends_on: Networks
990     type: OS::TripleO::Network::Ports::ExternalVipPort
991     properties:
992       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
993       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
994       PortName: public_virtual_ip
995       FixedIPs: {get_param: PublicVirtualFixedIPs}
996
997   InternalApiVirtualIP:
998     depends_on: Networks
999     type: OS::TripleO::Network::Ports::InternalApiVipPort
1000     properties:
1001       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1002       PortName: internal_api_virtual_ip
1003       FixedIPs: {get_param: InternalApiVirtualFixedIPs}
1004
1005   StorageVirtualIP:
1006     depends_on: Networks
1007     type: OS::TripleO::Network::Ports::StorageVipPort
1008     properties:
1009       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1010       PortName: storage_virtual_ip
1011       FixedIPs: {get_param: StorageVirtualFixedIPs}
1012
1013   StorageMgmtVirtualIP:
1014     depends_on: Networks
1015     type: OS::TripleO::Network::Ports::StorageMgmtVipPort
1016     properties:
1017       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1018       PortName: storage_management_virtual_ip
1019       FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
1020
1021   VipMap:
1022     type: OS::TripleO::Network::Ports::NetVipMap
1023     properties:
1024       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1025       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
1026       ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
1027       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1028       InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
1029       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1030       StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
1031       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1032       StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
1033       # No tenant or management VIP required
1034
1035   VipConfig:
1036     type: OS::TripleO::VipConfig
1037
1038   VipDeployment:
1039     type: OS::Heat::StructuredDeployments
1040     properties:
1041       name: VipDeployment
1042       config: {get_resource: VipConfig}
1043       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1044       input_values:
1045         # service VIP mappings
1046         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1047         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1048         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1049         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1050         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1051         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1052         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1053         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1054         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1055         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1056         aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
1057         gnocchi_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
1058         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1059         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1060         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1061         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1062         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1063         # direct configuration of Virtual IPs for each network
1064         control_virtual_ip: {get_attr: [VipMap, net_ip_map, ctlplane]}
1065         public_virtual_ip: {get_attr: [VipMap, net_ip_map, external]}
1066         internal_api_virtual_ip: {get_attr: [VipMap, net_ip_map, internal_api]}
1067         sahara_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
1068         ironic_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
1069         storage_virtual_ip: {get_attr: [VipMap, net_ip_map, storage]}
1070         storage_mgmt_virtual_ip: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
1071
1072   ControllerSwiftDeployment:
1073     type: OS::Heat::StructuredDeployments
1074     properties:
1075       name: ControllerSwiftDeployment
1076       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1077       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1078
1079   ObjectStorageSwiftDeployment:
1080     type: OS::Heat::StructuredDeployments
1081     properties:
1082       name: ObjectStorageSwiftDeployment
1083       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1084       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1085
1086   SwiftDevicesAndProxyConfig:
1087     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1088     properties:
1089       controller_swift_devices: {get_attr: [Controller, swift_device]}
1090       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1091       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1092
1093   ComputeCephDeployment:
1094     type: OS::Heat::StructuredDeployments
1095     properties:
1096       name: ComputeCephDeployment
1097       config: {get_attr: [CephClusterConfig, config_id]}
1098       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1099
1100   ControllerCephDeployment:
1101     type: OS::Heat::StructuredDeployments
1102     properties:
1103       name: ControllerCephDeployment
1104       config: {get_attr: [CephClusterConfig, config_id]}
1105       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1106
1107   CephStorageCephDeployment:
1108     type: OS::Heat::StructuredDeployments
1109     properties:
1110       name: CephStorageCephDeployment
1111       config: {get_attr: [CephClusterConfig, config_id]}
1112       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1113
1114   CephClusterConfig:
1115     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1116
1117   ControllerAllNodesDeployment:
1118     type: OS::Heat::StructuredDeployments
1119     properties:
1120       name: ControllerAllNodesDeployment
1121       config: {get_attr: [allNodesConfig, config_id]}
1122       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1123       input_values:
1124         bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1125         bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1126
1127   ComputeAllNodesDeployment:
1128     type: OS::Heat::StructuredDeployments
1129     properties:
1130       name: ComputeAllNodesDeployment
1131       config: {get_attr: [allNodesConfig, config_id]}
1132       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1133       input_values:
1134         bootstrap_nodeid: {get_attr: [Compute, resource.0.hostname]}
1135         bootstrap_nodeid_ip: {get_attr: [Compute, resource.0.ip_address]}
1136
1137   BlockStorageAllNodesDeployment:
1138     type: OS::Heat::StructuredDeployments
1139     properties:
1140       name: BlockStorageAllNodesDeployment
1141       config: {get_attr: [allNodesConfig, config_id]}
1142       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1143       input_values:
1144         bootstrap_nodeid: {get_attr: [BlockStorage, resource.0.hostname]}
1145         bootstrap_nodeid_ip: {get_attr: [BlockStorage, resource.0.ip_address]}
1146
1147   ObjectStorageAllNodesDeployment:
1148     type: OS::Heat::StructuredDeployments
1149     properties:
1150       name: ObjectStorageAllNodesDeployment
1151       config: {get_attr: [allNodesConfig, config_id]}
1152       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1153       input_values:
1154         bootstrap_nodeid: {get_attr: [ObjectStorage, resource.0.hostname]}
1155         bootstrap_nodeid_ip: {get_attr: [ObjectStorage, resource.0.ip_address]}
1156
1157   CephStorageAllNodesDeployment:
1158     type: OS::Heat::StructuredDeployments
1159     properties:
1160       name: CephStorageAllNodesDeployment
1161       config: {get_attr: [allNodesConfig, config_id]}
1162       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1163       input_values:
1164         bootstrap_nodeid: {get_attr: [CephStorage, resource.0.hostname]}
1165         bootstrap_nodeid_ip: {get_attr: [CephStorage, resource.0.ip_address]}
1166
1167   # All Nodes Validations
1168   AllNodesValidationConfig:
1169     type: OS::TripleO::AllNodes::Validation
1170     properties:
1171       PingTestIps:
1172         list_join:
1173         - ' '
1174         - - {get_attr: [Controller, resource.0.external_ip_address]}
1175           - {get_attr: [Controller, resource.0.internal_api_ip_address]}
1176           - {get_attr: [Controller, resource.0.storage_ip_address]}
1177           - {get_attr: [Controller, resource.0.storage_mgmt_ip_address]}
1178           - {get_attr: [Controller, resource.0.tenant_ip_address]}
1179
1180   ControllerAllNodesValidationDeployment:
1181     type: OS::Heat::StructuredDeployments
1182     depends_on: ControllerAllNodesDeployment
1183     properties:
1184       name: ControllerAllNodesValidationDeployment
1185       config: {get_resource: AllNodesValidationConfig}
1186       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1187
1188   ComputeAllNodesValidationDeployment:
1189     type: OS::Heat::StructuredDeployments
1190     depends_on: ComputeAllNodesDeployment
1191     properties:
1192       name: ComputeAllNodesValidationDeployment
1193       config: {get_resource: AllNodesValidationConfig}
1194       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1195
1196   BlockStorageAllNodesValidationDeployment:
1197     type: OS::Heat::StructuredDeployments
1198     depends_on: BlockStorageAllNodesDeployment
1199     properties:
1200       name: BlockStorageAllNodesValidationDeployment
1201       config: {get_resource: AllNodesValidationConfig}
1202       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1203
1204   ObjectStorageAllNodesValidationDeployment:
1205     type: OS::Heat::StructuredDeployments
1206     depends_on: ObjectStorageAllNodesDeployment
1207     properties:
1208       name: ObjectStorageAllNodesValidationDeployment
1209       config: {get_resource: AllNodesValidationConfig}
1210       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1211
1212   CephStorageAllNodesValidationDeployment:
1213     type: OS::Heat::StructuredDeployments
1214     depends_on: CephStorageAllNodesDeployment
1215     properties:
1216       name: CephStorageAllNodesValidationDeployment
1217       config: {get_resource: AllNodesValidationConfig}
1218       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1219
1220   UpdateWorkflow:
1221     type: OS::TripleO::Tasks::UpdateWorkflow
1222     properties:
1223       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1224       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1225       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1226       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1227       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1228       input_values:
1229         deploy_identifier: {get_param: DeployIdentifier}
1230         update_identifier: {get_param: UpdateIdentifier}
1231
1232   # Optional ExtraConfig for all nodes - all roles are passed in here, but
1233   # the nested template may configure each role differently (or not at all)
1234   AllNodesExtraConfig:
1235     type: OS::TripleO::AllNodesExtraConfig
1236     depends_on:
1237       - UpdateWorkflow
1238       - ComputeAllNodesValidationDeployment
1239       - BlockStorageAllNodesValidationDeployment
1240       - ObjectStorageAllNodesValidationDeployment
1241       - CephStorageAllNodesValidationDeployment
1242       - ControllerAllNodesValidationDeployment
1243     properties:
1244       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1245       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1246       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1247       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1248       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1249
1250   # Nested stack deployment runs after all other controller deployments
1251   ControllerNodesPostDeployment:
1252     type: OS::TripleO::ControllerPostDeployment
1253     depends_on: [ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1254     properties:
1255       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1256       RoleData: {get_attr: [ControllerServiceChain, role_data]}
1257
1258   ComputeNodesPostDeployment:
1259     type: OS::TripleO::ComputePostDeployment
1260     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1261     properties:
1262       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1263       RoleData: {get_attr: [ComputeServiceChain, role_data]}
1264
1265   ObjectStorageNodesPostDeployment:
1266     type: OS::TripleO::ObjectStoragePostDeployment
1267     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1268     properties:
1269       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1270       RoleData: {get_attr: [ObjectStorageServiceChain, role_data]}
1271
1272   BlockStorageNodesPostDeployment:
1273     type: OS::TripleO::BlockStoragePostDeployment
1274     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1275     properties:
1276       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1277       RoleData: {get_attr: [BlockStorageServiceChain, role_data]}
1278
1279   CephStorageNodesPostDeployment:
1280     type: OS::TripleO::CephStoragePostDeployment
1281     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1282     properties:
1283       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1284       RoleData: {get_attr: [CephStorageServiceChain, role_data]}
1285
1286 outputs:
1287   KeystoneURL:
1288     description: URL for the Overcloud Keystone service
1289     value: {get_attr: [EndpointMap, endpoint_map, KeystonePublic, uri]}
1290   KeystoneAdminVip:
1291     description: Keystone Admin VIP endpoint
1292     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1293   PublicVip:
1294     description: Controller VIP for public API endpoints
1295     value: {get_attr: [VipMap, net_ip_map, external]}
1296   AodhInternalVip:
1297     description: VIP for Aodh API internal endpoint
1298     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
1299   CeilometerInternalVip:
1300     description: VIP for Ceilometer API internal endpoint
1301     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1302   CinderInternalVip:
1303     description: VIP for Cinder API internal endpoint
1304     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1305   GlanceInternalVip:
1306     description: VIP for Glance API internal endpoint
1307     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1308   GnocchiInternalVip:
1309     description: VIP for Gnocchi API internal endpoint
1310     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
1311   HeatInternalVip:
1312     description: VIP for Heat API internal endpoint
1313     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1314   IronicInternalVip:
1315     description: VIP for Ironic API internal endpoint
1316     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
1317   KeystoneInternalVip:
1318     description: VIP for Keystone API internal endpoint
1319     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1320   NeutronInternalVip:
1321     description: VIP for Neutron API internal endpoint
1322     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1323   NovaInternalVip:
1324     description: VIP for Nova API internal endpoint
1325     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1326   SaharaInternalVip:
1327     description: VIP for Sahara API internal endpoint
1328     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
1329   SwiftInternalVip:
1330     description: VIP for Swift Proxy internal endpoint
1331     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1332   EndpointMap:
1333     description: |
1334       Mapping of the resources with the needed info for their endpoints.
1335       This includes the protocol used, the IP, port and also a full
1336       representation of the URI.
1337     value: {get_attr: [EndpointMap, endpoint_map]}
1338   HostsEntry:
1339     description: |
1340       The content that should be appended to your /etc/hosts if you want to get
1341       hostname-based access to the deployed nodes (useful for testing without
1342       setting up a DNS).
1343     value: {get_attr: [allNodesConfig, hosts_entries]}