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