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