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