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