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