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