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