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