Allow to enable fencing, pass through fencing config
[apex-tripleo-heat-templates.git] / overcloud-without-mergepy.yaml
1 heat_template_version: 2015-04-30
2
3 description: >
4   Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
5   server,Dedicated RabbitMQ Server,Group of Nova Computes
6
7
8 # TODO(shadower): we should probably use the parameter groups to put
9 # some order in here.
10 parameters:
11
12   # Common parameters (not specific to a role)
13   AdminPassword:
14     default: unset
15     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
16     type: string
17     hidden: true
18   CeilometerBackend:
19     default: 'mongodb'
20     description: The ceilometer backend type.
21     type: string
22   CeilometerMeteringSecret:
23     default: unset
24     description: Secret shared by the ceilometer services.
25     type: string
26     hidden: true
27   CeilometerPassword:
28     default: unset
29     description: The password for the ceilometer service account.
30     type: string
31     hidden: true
32   # This has to be an UUID so for now we generate it outside the template
33   CephClusterFSID:
34     default: ''
35     type: string
36     description: The Ceph cluster FSID. Must be a UUID.
37   CephMonKey:
38     default: ''
39     description: The Ceph monitors key. Can be created with ceph-authtool --gen-print-key.
40     type: string
41   CephAdminKey:
42     default: ''
43     description: The Ceph admin client key. Can be created with ceph-authtool --gen-print-key.
44     type: string
45   CinderEnableIscsiBackend:
46     default: true
47     description: Whether to enable or not the Iscsi backend for Cinder
48     type: boolean
49   CloudName:
50     default: ''
51     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
52     type: string
53   ControlFixedIPs:
54     default: []
55     description: Should be used for arbitrary ips.
56     type: json
57   Debug:
58     default: ''
59     description: Set to True to enable debugging on all services.
60     type: string
61   GlancePort:
62     default: "9292"
63     description: Glance port.
64     type: string
65   GlanceProtocol:
66     default: http
67     description: Protocol to use when connecting to glance, set to https for SSL.
68     type: string
69   ImageUpdatePolicy:
70     default: 'REBUILD_PRESERVE_EPHEMERAL'
71     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
72     type: string
73   KeyName:
74     default: default
75     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
76     type: string
77     constraints:
78       - custom_constraint: nova.keypair
79   NeutronBridgeMappings:
80     description: >
81       The OVS logical->physical bridge mappings to use. See the Neutron
82       documentation for details. Defaults to mapping br-ex - the external
83       bridge on hosts - to a physical name 'datacentre' which can be used
84       to create provider networks (and we use this for the default floating
85       network) - if changing this either use different post-install network
86       scripts or be sure to keep 'datacentre' as a mapping network name.
87     type: string
88     default: "datacentre:br-ex"
89   NeutronControlPlaneID:
90     default: ''
91     type: string
92     description: Neutron ID for ctlplane network.
93   NeutronEnableTunnelling:
94     type: string
95     default: "True"
96   NeutronFlatNetworks:
97     type: string
98     default: 'datacentre'
99     description: >
100       If set, flat networks to configure in neutron plugins. Defaults to
101       'datacentre' to permit external network creation.
102   NeutronNetworkType:
103     default: 'gre'
104     description: The tenant network type for Neutron, either gre or vxlan.
105     type: string
106   NeutronPassword:
107     default: unset
108     description: The password for the neutron service account, used by neutron agents.
109     type: string
110     hidden: true
111   NeutronPublicInterface:
112     default: nic1
113     description: What interface to bridge onto br-ex for network nodes.
114     type: string
115   NeutronPublicInterfaceTag:
116     default: ''
117     description: >
118       VLAN tag for creating a public VLAN. The tag will be used to
119       create an access port on the exterior bridge for each control plane node,
120       and that port will be given the IP address returned by neutron from the
121       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
122       overcloud.yaml to include the deployment of VLAN ports to the control
123       plane.
124     type: string
125   NeutronComputeAgentMode:
126     default: 'dvr'
127     description: Agent mode for the neutron-l3-agent on the compute hosts
128     type: string
129   NeutronAgentMode:
130     default: 'dvr_snat'
131     description: Agent mode for the neutron-l3-agent on the controller hosts
132     type: string
133   NeutronDVR:
134     default: 'False'
135     description: Whether to configure Neutron Distributed Virtual Routers
136     type: string
137   NeutronMetadataProxySharedSecret:
138     default: 'unset'
139     description: Shared secret to prevent spoofing
140     type: string
141   NeutronTunnelTypes:
142     default: 'gre'
143     description: |
144         The tunnel types for the Neutron tenant network. To specify multiple
145         values, use a comma separated string, like so: 'gre,vxlan'
146     type: string
147   NeutronMechanismDrivers:
148     default: 'openvswitch'
149     description: |
150         The mechanism drivers for the Neutron tenant network. To specify multiple
151         values, use a comma separated string, like so: 'openvswitch,l2_population'
152     type: string
153   NeutronAllowL3AgentFailover:
154     default: 'True'
155     description: Allow automatic l3-agent failover
156     type: string
157   NeutronL3HA:
158     default: 'False'
159     description: Whether to enable l3-agent HA
160     type: string
161   NovaPassword:
162     default: unset
163     description: The password for the nova service account, used by nova-api.
164     type: string
165     hidden: true
166   NtpServer:
167     type: string
168     default: ''
169   PublicVirtualFixedIPs:
170     default: []
171     description: >
172         Control the IP allocation for the PublicVirtualInterface port. E.g.
173         [{'ip_address':'1.2.3.4'}]
174     type: json
175   PublicVirtualNetwork:
176     default: 'ctlplane'
177     type: string
178     description: >
179         Neutron network to allocate public virtual IP port on.
180   RabbitCookieSalt:
181     type: string
182     default: unset
183     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
184   # FIXME: 'guest' is provisioned in RabbitMQ by default, we should create a user if these are changed
185   RabbitUserName:
186     default: guest
187     description: The username for RabbitMQ
188     type: string
189   RabbitPassword:
190     default: guest
191     description: The password for RabbitMQ
192     type: string
193     hidden: true
194   RabbitClientUseSSL:
195     default: false
196     description: >
197         Rabbit client subscriber parameter to specify
198         an SSL connection to the RabbitMQ host.
199     type: string
200   RabbitClientPort:
201     default: 5672
202     description: Set rabbit subscriber port, change this if using SSL
203     type: number
204   SnmpdReadonlyUserName:
205     default: ro_snmp_user
206     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
207     type: string
208   SnmpdReadonlyUserPassword:
209     default: unset
210     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
211     type: string
212     hidden: true
213
214   # Controller-specific params
215   AdminToken:
216     default: unset
217     description: The keystone auth secret.
218     type: string
219     hidden: true
220   CinderEnableRbdBackend:
221     default: false
222     description: Whether to enable or not the Rbd backend for Cinder
223     type: boolean
224   CinderLVMLoopDeviceSize:
225     default: 5000
226     description: The size of the loopback file used by the cinder LVM driver.
227     type: number
228   CinderPassword:
229     default: unset
230     description: The password for the cinder service account, used by cinder-api.
231     type: string
232     hidden: true
233   CinderISCSIHelper:
234     default: tgtadm
235     description: The iSCSI helper to use with cinder.
236     type: string
237   ControllerCount:
238     type: number
239     default: 1
240   controllerExtraConfig:
241     default: {}
242     description: |
243       Controller specific configuration to inject into the cluster. Same
244       structure as ExtraConfig.
245     type: json
246   controllerImage:
247     type: string
248     default: overcloud-control
249     constraints:
250       - custom_constraint: glance.image
251   OvercloudControlFlavor:
252     description: Flavor for control nodes to request when deploying.
253     type: string
254     constraints:
255       - custom_constraint: nova.flavor
256   ControlVirtualInterface:
257     default: 'br-ex'
258     description: Interface where virtual ip will be assigned.
259     type: string
260   EnableFencing:
261     default: false
262     description: Whether to enable fencing in Pacemaker or not.
263     type: boolean
264   EnableGalera:
265     default: true
266     description: Whether to use Galera instead of regular MariaDB.
267     type: boolean
268   ControllerEnableCephStorage:
269     default: false
270     description: Whether to deploy Ceph Storage (OSD) on the Controller
271     type: boolean
272   ControllerEnableSwiftStorage:
273     default: true
274     description: Whether to enable Swift Storage on the Controller
275     type: boolean
276   ExtraConfig:
277     default: {}
278     description: |
279       Additional configuration to inject into the cluster. The JSON should have
280       the following structure:
281         {"FILEKEY":
282           {"config":
283             [{"section": "SECTIONNAME",
284               "values":
285                 [{"option": "OPTIONNAME",
286                   "value": "VALUENAME"
287                  }
288                 ]
289              }
290             ]
291           }
292         }
293       For instance:
294         {"nova":
295           {"config":
296             [{"section": "default",
297               "values":
298                 [{"option": "force_config_drive",
299                   "value": "always"
300                  }
301                 ]
302              },
303              {"section": "cells",
304               "values":
305                 [{"option": "driver",
306                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
307                  }
308                 ]
309              }
310             ]
311           }
312         }
313     type: json
314   FencingConfig:
315     default: {}
316     description: |
317       Pacemaker fencing configuration. The JSON should have
318       the following structure:
319         {
320           "devices": [
321             {
322               "agent": "AGENT_NAME",
323               "host_mac": "HOST_MAC_ADDRESS",
324               "params": {"PARAM_NAME": "PARAM_VALUE"}
325             }
326           ]
327         }
328       For instance:
329         {
330           "devices": [
331             {
332               "agent": "fence_xvm",
333               "host_mac": "52:54:00:aa:bb:cc",
334               "params": {
335                 "multicast_address": "225.0.0.12",
336                 "port": "baremetal_0",
337                 "manage_fw": true,
338                 "manage_key_file": true,
339                 "key_file": "/etc/fence_xvm.key",
340                 "key_file_password": "abcdef"
341               }
342             }
343           ]
344         }
345     type: json
346   GlanceLogFile:
347     description: The filepath of the file to use for logging messages from Glance.
348     type: string
349     default: ''
350   GlanceNotifierStrategy:
351     description: Strategy to use for Glance notification queue
352     type: string
353     default: noop
354   GlancePassword:
355     default: unset
356     description: The password for the glance service account, used by the glance services.
357     type: string
358     hidden: true
359   GlanceBackend:
360     default: swift
361     description: The short name of the Glance backend to use. Should be one
362       of swift, rbd or file
363     type: string
364     constraints:
365     - allowed_values: ['swift', 'file', 'rbd']
366   HeatPassword:
367     default: unset
368     description: The password for the Heat service account, used by the Heat services.
369     type: string
370     hidden: true
371   HeatStackDomainAdminPassword:
372     description: Password for heat_domain_admin user.
373     type: string
374     default: ''
375     hidden: true
376   KeystoneCACertificate:
377     default: ''
378     description: Keystone self-signed certificate authority certificate.
379     type: string
380   KeystoneSigningCertificate:
381     default: ''
382     description: Keystone certificate for verifying token validity.
383     type: string
384   KeystoneSigningKey:
385     default: ''
386     description: Keystone key for signing tokens.
387     type: string
388     hidden: true
389   KeystoneSSLCertificate:
390     default: ''
391     description: Keystone certificate for verifying token validity.
392     type: string
393   KeystoneSSLCertificateKey:
394     default: ''
395     description: Keystone key for signing tokens.
396     type: string
397     hidden: true
398   MysqlInnodbBufferPoolSize:
399     description: >
400         Specifies the size of the buffer pool in megabytes. Setting to
401         zero should be interpreted as "no value" and will defer to the
402         lower level default.
403     type: number
404     default: 0
405   NeutronDnsmasqOptions:
406     default: 'dhcp-option-force=26,1400'
407     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
408     type: string
409   NeutronPublicInterfaceDefaultRoute:
410     default: ''
411     description: A custom default route for the NeutronPublicInterface.
412     type: string
413   NeutronPublicInterfaceIP:
414     default: ''
415     description: A custom IP address to put onto the NeutronPublicInterface.
416     type: string
417   NeutronPublicInterfaceRawDevice:
418     default: ''
419     description: If set, the public interface is a vlan with this device as the raw device.
420     type: string
421   PublicVirtualInterface:
422     default: 'br-ex'
423     description: >
424         Specifies the interface where the public-facing virtual ip will be assigned.
425         This should be int_public when a VLAN is being used.
426     type: string
427   SSLCertificate:
428     default: ''
429     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
430     type: string
431     hidden: true
432   SSLKey:
433     default: ''
434     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
435     type: string
436     hidden: true
437   SSLCACertificate:
438     default: ''
439     description: If set, the contents of an SSL certificate authority file.
440     type: string
441   SwiftHashSuffix:
442     default: unset
443     description: A random string to be used as a salt when hashing to determine mappings in the ring.
444     type: string
445     hidden: true
446   SwiftPassword:
447     default: unset
448     description: The password for the swift service account, used by the swift proxy services.
449     type: string
450     hidden: true
451   SwiftMountCheck:
452     default: 'false'
453     description: Value of mount_check in Swift account/container/object -server.conf
454     type: boolean
455   SwiftMinPartHours:
456     type: number
457     default: 1
458     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
459   SwiftPartPower:
460     default: 10
461     description: Partition Power to use when building Swift rings
462     type: number
463   SwiftReplicas:
464     type: number
465     default: 3
466     description: How many replicas to use in the swift rings.
467
468 # Compute-specific params
469   CeilometerComputeAgent:
470     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
471     type: string
472     default: ''
473     constraints:
474     - allowed_values: ['', Present]
475   ComputeCount:
476     type: number
477     default: 1
478   HypervisorNeutronPhysicalBridge:
479     default: 'br-ex'
480     description: >
481       An OVS bridge to create on each hypervisor. This defaults to br-ex the
482       same as the control plane nodes, as we have a uniform configuration of
483       the openvswitch agent. Typically should not need to be changed.
484     type: string
485   HypervisorNeutronPublicInterface:
486     default: nic1
487     description: What interface to add to the HypervisorNeutronPhysicalBridge.
488     type: string
489   NeutronNetworkVLANRanges:
490     default: 'datacentre'
491     description: >
492       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
493       Neutron documentation for permitted values. Defaults to permitting any
494       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
495     type: comma_delimited_list
496   NovaComputeDriver:
497     type: string
498     default: libvirt.LibvirtDriver
499   NovaComputeExtraConfig:
500     default: {}
501     description: |
502       NovaCompute specific configuration to inject into the cluster. Same
503       structure as ExtraConfig.
504     type: json
505   NovaComputeLibvirtType:
506     default: ''
507     type: string
508   NovaEnableRbdBackend:
509     default: false
510     description: Whether to enable or not the Rbd backend for Nova
511     type: boolean
512   NovaImage:
513     type: string
514     default: overcloud-compute
515     constraints:
516       - custom_constraint: glance.image
517   OvercloudComputeFlavor:
518     description: Use this flavor
519     type: string
520     constraints:
521       - custom_constraint: nova.flavor
522   ServiceNetMap:
523     default:
524       NeutronTenantNetwork: tenant
525       CeilometerApiNetwork: internal_api
526       MongoDbNetwork: internal_api
527       CinderApiNetwork: internal_api
528       CinderIscsiNetwork: storage
529       GlanceApiNetwork: storage
530       GlanceRegistryNetwork: internal_api
531       KeystoneAdminApiNetwork: internal_api
532       KeystonePublicApiNetwork: internal_api
533       NeutronApiNetwork: internal_api
534       HeatApiNetwork: internal_api
535       NovaApiNetwork: internal_api
536       NovaMetadataNetwork: internal_api
537       NovaVncProxyNetwork: internal_api
538       SwiftMgmtNetwork: storage_mgmt
539       SwiftProxyNetwork: storage
540       HorizonNetwork: internal_api
541       MemcachedNetwork: internal_api
542       RabbitMqNetwork: internal_api
543       RedisNetwork: internal_api
544       MysqlNetwork: internal_api
545       CephClusterNetwork: storage_mgmt
546       CephPublicNetwork: storage
547     description: Mapping of service_name -> network name. Typically set
548                  via parameter_defaults in the resource registry.
549     type: json
550
551 # Block storage specific parameters
552   BlockStorageCount:
553     type: number
554     default: 0
555   BlockStorageImage:
556     default: overcloud-cinder-volume
557     type: string
558   OvercloudBlockStorageFlavor:
559     description: Flavor for block storage nodes to request when deploying.
560     type: string
561     constraints:
562       - custom_constraint: nova.flavor
563
564 # Object storage specific parameters
565   ObjectStorageCount:
566     type: number
567     default: 0
568   OvercloudSwiftStorageFlavor:
569     description: Flavor for Swift storage nodes to request when deploying.
570     type: string
571     constraints:
572       - custom_constraint: nova.flavor
573   SwiftStorageImage:
574     default: overcloud-swift-storage
575     type: string
576
577 # Ceph storage specific parameters
578   CephStorageCount:
579     type: number
580     default: 0
581   CephStorageImage:
582     default: overcloud-ceph-storage
583     type: string
584   OvercloudCephStorageFlavor:
585     default: baremetal
586     description: Flavor for Ceph storage nodes to request when deploying.
587     type: string
588     constraints:
589       - custom_constraint: nova.flavor
590
591   # Hostname format for each role
592   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
593   # and %stackname% is replaced with OS::stack_name in the template below.
594   # If you want to use the heat generated names, pass '' (empty string).
595   ControllerHostnameFormat:
596     type: string
597     description: Format for Controller node hostnames
598     default: '%stackname%-controller-%index%'
599   ComputeHostnameFormat:
600     type: string
601     description: Format for Compute node hostnames
602     default: '%stackname%-novacompute-%index%'
603   BlockStorageHostnameFormat:
604     type: string
605     description: Format for BlockStorage node hostnames
606     default: '%stackname%-blockstorage-%index%'
607   ObjectStorageHostnameFormat:
608     type: string
609     description: Format for SwiftStorage node hostnames
610     default: '%stackname%-objectstorage-%index%'
611   CephStorageHostnameFormat:
612     type: string
613     description: Format for CephStorage node hostnames
614     default: '%stackname%-cephstorage-%index%'
615
616   # Identifiers to trigger tasks on nodes
617   UpdateIdentifier:
618     default: ''
619     type: string
620     description: >
621       Setting to a previously unused value during stack-update will trigger
622       package update on all nodes
623
624
625
626 resources:
627
628   HeatAuthEncryptionKey:
629     type: OS::Heat::RandomString
630
631   PcsdPassword:
632     type: OS::Heat::RandomString
633     properties:
634       length: 16
635
636   HorizonSecret:
637     type: OS::Heat::RandomString
638     properties:
639       length: 10
640
641   Controller:
642     type: OS::Heat::ResourceGroup
643     depends_on: Networks
644     properties:
645       count: {get_param: ControllerCount}
646       resource_def:
647         type: OS::TripleO::Controller
648         properties:
649           AdminPassword: {get_param: AdminPassword}
650           AdminToken: {get_param: AdminToken}
651           CeilometerBackend: {get_param: CeilometerBackend}
652           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
653           CeilometerPassword: {get_param: CeilometerPassword}
654           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
655           CinderPassword: {get_param: CinderPassword}
656           CinderISCSIHelper: {get_param: CinderISCSIHelper}
657           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
658           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
659           CloudName: {get_param: CloudName}
660           ControlVirtualInterface: {get_param: ControlVirtualInterface}
661           ControllerExtraConfig: {get_param: controllerExtraConfig}
662           Debug: {get_param: Debug}
663           EnableFencing: {get_param: EnableFencing}
664           EnableGalera: {get_param: EnableGalera}
665           EnableCephStorage: {get_param: ControllerEnableCephStorage}
666           EnableSwiftStorage: {get_param: ControllerEnableSwiftStorage}
667           ExtraConfig: {get_param: ExtraConfig}
668           FencingConfig: {get_param: FencingConfig}
669           Flavor: {get_param: OvercloudControlFlavor}
670           GlancePort: {get_param: GlancePort}
671           GlanceProtocol: {get_param: GlanceProtocol}
672           GlancePassword: {get_param: GlancePassword}
673           GlanceBackend: {get_param: GlanceBackend}
674           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
675           GlanceLogFile: {get_param: GlanceLogFile}
676           HeatPassword: {get_param: HeatPassword}
677           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
678           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
679           HorizonSecret: {get_resource: HorizonSecret}
680           Image: {get_param: controllerImage}
681           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
682           KeyName: {get_param: KeyName}
683           KeystoneCACertificate: {get_param: KeystoneCACertificate}
684           KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
685           KeystoneSigningKey: {get_param: KeystoneSigningKey}
686           KeystoneSSLCertificate: {get_param: KeystoneSSLCertificate}
687           KeystoneSSLCertificateKey: {get_param: KeystoneSSLCertificateKey}
688           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
689           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
690           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
691           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
692           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
693           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
694           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
695           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
696           NeutronPublicInterface: {get_param: NeutronPublicInterface}
697           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
698           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
699           NeutronPassword: {get_param: NeutronPassword}
700           NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
701           NeutronDVR: {get_param: NeutronDVR}
702           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
703           NeutronAgentMode: {get_param: NeutronAgentMode}
704           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
705           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
706           NeutronL3HA: {get_param: NeutronL3HA}
707           NeutronNetworkType: {get_param: NeutronNetworkType}
708           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
709           NovaPassword: {get_param: NovaPassword}
710           NtpServer: {get_param: NtpServer}
711           PcsdPassword: {get_resource: PcsdPassword}
712           PublicVirtualInterface: {get_param: PublicVirtualInterface}
713           RabbitPassword: {get_param: RabbitPassword}
714           RabbitUserName: {get_param: RabbitUserName}
715           RabbitCookie: {get_attr: [RabbitCookie, value]}
716           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
717           RabbitClientPort: {get_param: RabbitClientPort}
718           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
719           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
720           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
721           SSLCertificate: {get_param: SSLCertificate}
722           SSLKey: {get_param: SSLKey}
723           SSLCACertificate: {get_param: SSLCACertificate}
724           SwiftHashSuffix: {get_param: SwiftHashSuffix}
725           SwiftMountCheck: {get_param: SwiftMountCheck}
726           SwiftMinPartHours: {get_param: SwiftMinPartHours}
727           SwiftPartPower: {get_param: SwiftPartPower}
728           SwiftPassword: {get_param: SwiftPassword}
729           SwiftReplicas: { get_param: SwiftReplicas}
730           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
731           PublicVirtualIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
732           ServiceNetMap: {get_param: ServiceNetMap}
733           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
734           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
735           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
736           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
737           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
738           UpdateIdentifier: {get_param: UpdateIdentifier}
739           Hostname:
740             str_replace:
741               template: {get_param: ControllerHostnameFormat}
742               params:
743                 '%stackname%': {get_param: 'OS::stack_name'}
744
745   Compute:
746     type: OS::Heat::ResourceGroup
747     depends_on: Networks
748     properties:
749       count: {get_param: ComputeCount}
750       resource_def:
751         type: OS::TripleO::Compute
752         properties:
753           AdminPassword: {get_param: AdminPassword}
754           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
755           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
756           CeilometerPassword: {get_param: CeilometerPassword}
757           Debug: {get_param: Debug}
758           ExtraConfig: {get_param: ExtraConfig}
759           Flavor: {get_param: OvercloudComputeFlavor}
760           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
761           GlancePort: {get_param: GlancePort}
762           GlanceProtocol: {get_param: GlanceProtocol}
763           Image: {get_param: NovaImage}
764           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
765           KeyName: {get_param: KeyName}
766           KeystoneHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
767           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
768           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
769           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
770           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
771           NeutronNetworkType: {get_param: NeutronNetworkType}
772           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
773           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
774           NeutronPassword: {get_param: NeutronPassword}
775           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
776           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
777           NeutronDVR: {get_param: NeutronDVR}
778           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
779           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
780           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
781           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
782           # L3 HA and Failover is not relevant for Computes, should be removed
783           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
784           NeutronL3HA: {get_param: NeutronL3HA}
785           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
786           NovaComputeDriver: {get_param: NovaComputeDriver}
787           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
788           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
789           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
790           NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
791           NovaPassword: {get_param: NovaPassword}
792           NtpServer: {get_param: NtpServer}
793           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
794           RabbitPassword: {get_param: RabbitPassword}
795           RabbitUserName: {get_param: RabbitUserName}
796           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
797           RabbitClientPort: {get_param: RabbitClientPort}
798           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
799           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
800           ServiceNetMap: {get_param: ServiceNetMap}
801           UpdateIdentifier: {get_param: UpdateIdentifier}
802           Hostname:
803             str_replace:
804               template: {get_param: ComputeHostnameFormat}
805               params:
806                 '%stackname%': {get_param: 'OS::stack_name'}
807
808   BlockStorage:
809     type: OS::Heat::ResourceGroup
810     depends_on: Networks
811     properties:
812       count: {get_param: BlockStorageCount}
813       resource_def:
814         type: OS::TripleO::BlockStorage
815         properties:
816           Debug: {get_param: Debug}
817           Image: {get_param: BlockStorageImage}
818           CinderISCSIHelper: {get_param: CinderISCSIHelper}
819           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
820           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
821           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
822           CinderPassword: {get_param: CinderPassword}
823           KeyName: {get_param: KeyName}
824           Flavor: {get_param: OvercloudBlockStorageFlavor}
825           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
826           GlancePort: {get_param: GlancePort}
827           GlanceProtocol: {get_param: GlanceProtocol}
828           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
829           RabbitPassword: {get_param: RabbitPassword}
830           RabbitUserName: {get_param: RabbitUserName}
831           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
832           RabbitClientPort: {get_param: RabbitClientPort}
833           NtpServer: {get_param: NtpServer}
834           UpdateIdentifier: {get_param: UpdateIdentifier}
835           Hostname:
836             str_replace:
837               template: {get_param: BlockStorageHostnameFormat}
838               params:
839                 '%stackname%': {get_param: 'OS::stack_name'}
840           ServiceNetMap: {get_param: ServiceNetMap}
841           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
842
843   ObjectStorage:
844     type: OS::Heat::ResourceGroup
845     depends_on: Networks
846     properties:
847       count: {get_param: ObjectStorageCount}
848       resource_def:
849         type: OS::TripleO::ObjectStorage
850         properties:
851           KeyName: {get_param: KeyName}
852           Flavor: {get_param: OvercloudSwiftStorageFlavor}
853           HashSuffix: {get_param: SwiftHashSuffix}
854           MountCheck: {get_param: SwiftMountCheck}
855           MinPartHours: {get_param: SwiftMinPartHours}
856           PartPower: {get_param: SwiftPartPower}
857           Image: {get_param: SwiftStorageImage}
858           Replicas: { get_param: SwiftReplicas}
859           NtpServer: {get_param: NtpServer}
860           UpdateIdentifier: {get_param: UpdateIdentifier}
861           ServiceNetMap: {get_param: ServiceNetMap}
862           Hostname:
863             str_replace:
864               template: {get_param: ObjectStorageHostnameFormat}
865               params:
866                 '%stackname%': {get_param: 'OS::stack_name'}
867
868   CephStorage:
869     type: OS::Heat::ResourceGroup
870     depends_on: Networks
871     properties:
872       count: {get_param: CephStorageCount}
873       resource_def:
874         type: OS::TripleO::CephStorage
875         properties:
876           Image: {get_param: CephStorageImage}
877           KeyName: {get_param: KeyName}
878           Flavor: {get_param: OvercloudCephStorageFlavor}
879           NtpServer: {get_param: NtpServer}
880           ServiceNetMap: {get_param: ServiceNetMap}
881           UpdateIdentifier: {get_param: UpdateIdentifier}
882           Hostname:
883             str_replace:
884               template: {get_param: CephStorageHostnameFormat}
885               params:
886                 '%stackname%': {get_param: 'OS::stack_name'}
887
888   ControllerIpListMap:
889     type: OS::TripleO::Network::Ports::NetIpListMap
890     properties:
891       ExternalIpList: {get_attr: [Controller, external_ip_address]}
892       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
893       StorageIpList: {get_attr: [Controller, storage_ip_address]}
894       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
895       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
896
897   allNodesConfig:
898     type: OS::TripleO::AllNodes::SoftwareConfig
899     properties:
900       compute_hosts: {get_attr: [Compute, hosts_entry]}
901       controller_hosts: {get_attr: [Controller, hosts_entry]}
902       controller_ips: {get_attr: [Controller, ip_address]}
903       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
904       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
905       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
906       controller_names: {get_attr: [Controller, hostname]}
907       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
908       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
909       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
910       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
911       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
912       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
913       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
914       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
915       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
916       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
917       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
918       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
919       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
920       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
921       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
922       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
923       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
924
925   MysqlRootPassword:
926     type: OS::Heat::RandomString
927     properties:
928       length: 10
929
930   MysqlClusterUniquePart:
931     type: OS::Heat::RandomString
932     properties:
933       length: 10
934
935   RabbitCookie:
936     type: OS::Heat::RandomString
937     properties:
938       length: 20
939       salt: {get_param: RabbitCookieSalt}
940
941   # creates the network architecture
942   Networks:
943     type: OS::TripleO::Network
944
945   ControlVirtualIP:
946     type: OS::Neutron::Port
947     depends_on: Networks
948     properties:
949       name: control_virtual_ip
950       network_id: {get_param: NeutronControlPlaneID}
951       fixed_ips: {get_param: ControlFixedIPs}
952       replacement_policy: AUTO
953
954   RedisVirtualIP:
955     depends_on: Networks
956     type: OS::TripleO::Controller::Ports::RedisVipPort
957     properties:
958       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
959       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
960       PortName: redis_virtual_ip
961       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
962
963   # same as external
964   PublicVirtualIP:
965     type: OS::Neutron::Port
966     depends_on: Networks
967     properties:
968       name: public_virtual_ip
969       network: {get_param: PublicVirtualNetwork}
970       fixed_ips: {get_param: PublicVirtualFixedIPs}
971       replacement_policy: AUTO
972
973   InternalApiVirtualIP:
974     depends_on: Networks
975     type: OS::TripleO::Controller::Ports::InternalApiPort
976     properties:
977       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
978       PortName: internal_api_virtual_ip
979
980   StorageVirtualIP:
981     depends_on: Networks
982     type: OS::TripleO::Controller::Ports::StoragePort
983     properties:
984       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
985       PortName: storage_virtual_ip
986
987   StorageMgmtVirtualIP:
988     depends_on: Networks
989     type: OS::TripleO::Controller::Ports::StorageMgmtPort
990     properties:
991       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
992       PortName: storage_management_virtual_ip
993
994   VipMap:
995     type: OS::TripleO::Network::Ports::NetIpMap
996     properties:
997       ExternalIp: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
998       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
999       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1000       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1001       # No tenant VIP required
1002
1003   VipConfig:
1004     type: OS::TripleO::VipConfig
1005
1006   VipDeployment:
1007     type: OS::Heat::StructuredDeployments
1008     properties:
1009       config: {get_resource: VipConfig}
1010       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1011       input_values:
1012         # service VIP mappings
1013         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1014         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1015         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1016         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1017         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1018         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1019         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1020         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1021         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1022         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1023         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1024         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1025         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1026         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1027         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1028         # direct configuration of Virtual IPs for each network
1029         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1030         public_virtual_ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1031         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
1032         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
1033         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1034
1035   ControllerBootstrapNodeConfig:
1036     type: OS::TripleO::BootstrapNode::SoftwareConfig
1037     properties:
1038       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1039       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1040
1041   ControllerBootstrapNodeDeployment:
1042     type: OS::Heat::StructuredDeployments
1043     properties:
1044       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1045       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1046
1047   ControllerSwiftDeployment:
1048     type: OS::Heat::StructuredDeployments
1049     properties:
1050       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1051       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1052
1053   ObjectStorageSwiftDeployment:
1054     type: OS::Heat::StructuredDeployments
1055     properties:
1056       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1057       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1058
1059   SwiftDevicesAndProxyConfig:
1060     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1061     properties:
1062       controller_swift_devices: {get_attr: [Controller, swift_device]}
1063       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1064       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1065
1066   ComputeCephDeployment:
1067     type: OS::Heat::StructuredDeployments
1068     properties:
1069       config: {get_attr: [CephClusterConfig, config_id]}
1070       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1071
1072   ControllerCephDeployment:
1073     type: OS::Heat::StructuredDeployments
1074     properties:
1075       config: {get_attr: [CephClusterConfig, config_id]}
1076       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1077
1078   CephStorageCephDeployment:
1079     type: OS::Heat::StructuredDeployments
1080     properties:
1081       config: {get_attr: [CephClusterConfig, config_id]}
1082       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1083
1084   CephClusterConfig:
1085     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1086     properties:
1087       ceph_fsid: {get_param: CephClusterFSID}
1088       ceph_mon_key: {get_param: CephMonKey}
1089       ceph_admin_key: {get_param: CephAdminKey}
1090       ceph_mon_names: {get_attr: [Controller, hostname]}
1091       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1092
1093   ControllerClusterConfig:
1094     type: OS::Heat::StructuredConfig
1095     properties:
1096       group: os-apply-config
1097       config:
1098         corosync:
1099           nodes: {get_attr: [Controller, corosync_node]}
1100         horizon:
1101           caches:
1102             memcached:
1103               nodes: {get_attr: [Controller, hostname]}
1104         mysql:
1105           nodes: {get_attr: [Controller, corosync_node]}
1106         haproxy:
1107           nodes: {get_attr: [Controller, corosync_node]}
1108
1109   ControllerClusterDeployment:
1110     type: OS::Heat::StructuredDeployments
1111     properties:
1112       config: {get_resource: ControllerClusterConfig}
1113       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1114
1115   ControllerAllNodesDeployment:
1116     type: OS::Heat::StructuredDeployments
1117     properties:
1118       config: {get_attr: [allNodesConfig, config_id]}
1119       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1120
1121   ComputeAllNodesDeployment:
1122     type: OS::Heat::StructuredDeployments
1123     properties:
1124       config: {get_attr: [allNodesConfig, config_id]}
1125       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1126
1127   BlockStorageAllNodesDeployment:
1128     type: OS::Heat::StructuredDeployments
1129     properties:
1130       config: {get_attr: [allNodesConfig, config_id]}
1131       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1132
1133   ObjectStorageAllNodesDeployment:
1134     type: OS::Heat::StructuredDeployments
1135     properties:
1136       config: {get_attr: [allNodesConfig, config_id]}
1137       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1138
1139   CephStorageAllNodesDeployment:
1140     type: OS::Heat::StructuredDeployments
1141     properties:
1142       config: {get_attr: [allNodesConfig, config_id]}
1143       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1144
1145   # Nested stack deployment runs after all other controller deployments
1146   ControllerNodesPostDeployment:
1147     type: OS::TripleO::ControllerPostDeployment
1148     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1149     properties:
1150       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1151       NodeConfigIdentifiers: {get_attr: [Controller, attributes, config_identifier]}
1152
1153   ComputeNodesPostDeployment:
1154     type: OS::TripleO::ComputePostDeployment
1155     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1156     properties:
1157       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1158       NodeConfigIdentifiers: {get_attr: [Compute, attributes, config_identifier]}
1159
1160   ObjectStorageNodesPostDeployment:
1161     type: OS::TripleO::ObjectStoragePostDeployment
1162     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1163     properties:
1164       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1165       NodeConfigIdentifiers: {get_attr: [ObjectStorage, attributes, config_identifier]}
1166
1167
1168   BlockStorageNodesPostDeployment:
1169     type: OS::TripleO::BlockStoragePostDeployment
1170     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1171     properties:
1172       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1173       NodeConfigIdentifiers: {get_attr: [BlockStorage, attributes, config_identifier]}
1174
1175   CephStorageNodesPostDeployment:
1176     type: OS::TripleO::CephStoragePostDeployment
1177     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1178     properties:
1179       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1180       NodeConfigIdentifiers: {get_attr: [CephStorage, attributes, config_identifier]}
1181
1182 outputs:
1183   KeystoneURL:
1184     description: URL for the Overcloud Keystone service
1185     value:
1186       list_join:
1187       - ''
1188       - - http://
1189         - {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1190         - :5000/v2.0/