Enable httpd balancing for Horizon
[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   EnableGalera:
261     default: true
262     description: Whether to use Galera instead of regular MariaDB.
263     type: boolean
264   ControllerEnableCephStorage:
265     default: false
266     description: Whether to deploy Ceph Storage (OSD) on the Controller
267     type: boolean
268   ControllerEnableSwiftStorage:
269     default: true
270     description: Whether to enable Swift Storage on the Controller
271     type: boolean
272   ExtraConfig:
273     default: {}
274     description: |
275       Additional configuration to inject into the cluster. The JSON should have
276       the following structure:
277         {"FILEKEY":
278           {"config":
279             [{"section": "SECTIONNAME",
280               "values":
281                 [{"option": "OPTIONNAME",
282                   "value": "VALUENAME"
283                  }
284                 ]
285              }
286             ]
287           }
288         }
289       For instance:
290         {"nova":
291           {"config":
292             [{"section": "default",
293               "values":
294                 [{"option": "force_config_drive",
295                   "value": "always"
296                  }
297                 ]
298              },
299              {"section": "cells",
300               "values":
301                 [{"option": "driver",
302                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
303                  }
304                 ]
305              }
306             ]
307           }
308         }
309     type: json
310   GlanceLogFile:
311     description: The filepath of the file to use for logging messages from Glance.
312     type: string
313     default: ''
314   GlanceNotifierStrategy:
315     description: Strategy to use for Glance notification queue
316     type: string
317     default: noop
318   GlancePassword:
319     default: unset
320     description: The password for the glance service account, used by the glance services.
321     type: string
322     hidden: true
323   GlanceBackend:
324     default: swift
325     description: The short name of the Glance backend to use. Should be one
326       of swift, rbd or file
327     type: string
328     constraints:
329     - allowed_values: ['swift', 'file', 'rbd']
330   HeatPassword:
331     default: unset
332     description: The password for the Heat service account, used by the Heat services.
333     type: string
334     hidden: true
335   HeatStackDomainAdminPassword:
336     description: Password for heat_domain_admin user.
337     type: string
338     default: ''
339     hidden: true
340   KeystoneCACertificate:
341     default: ''
342     description: Keystone self-signed certificate authority certificate.
343     type: string
344   KeystoneSigningCertificate:
345     default: ''
346     description: Keystone certificate for verifying token validity.
347     type: string
348   KeystoneSigningKey:
349     default: ''
350     description: Keystone key for signing tokens.
351     type: string
352     hidden: true
353   KeystoneSSLCertificate:
354     default: ''
355     description: Keystone certificate for verifying token validity.
356     type: string
357   KeystoneSSLCertificateKey:
358     default: ''
359     description: Keystone key for signing tokens.
360     type: string
361     hidden: true
362   MysqlInnodbBufferPoolSize:
363     description: >
364         Specifies the size of the buffer pool in megabytes. Setting to
365         zero should be interpreted as "no value" and will defer to the
366         lower level default.
367     type: number
368     default: 0
369   NeutronDnsmasqOptions:
370     default: 'dhcp-option-force=26,1400'
371     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
372     type: string
373   NeutronPublicInterfaceDefaultRoute:
374     default: ''
375     description: A custom default route for the NeutronPublicInterface.
376     type: string
377   NeutronPublicInterfaceIP:
378     default: ''
379     description: A custom IP address to put onto the NeutronPublicInterface.
380     type: string
381   NeutronPublicInterfaceRawDevice:
382     default: ''
383     description: If set, the public interface is a vlan with this device as the raw device.
384     type: string
385   PublicVirtualInterface:
386     default: 'br-ex'
387     description: >
388         Specifies the interface where the public-facing virtual ip will be assigned.
389         This should be int_public when a VLAN is being used.
390     type: string
391   SSLCertificate:
392     default: ''
393     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
394     type: string
395     hidden: true
396   SSLKey:
397     default: ''
398     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
399     type: string
400     hidden: true
401   SSLCACertificate:
402     default: ''
403     description: If set, the contents of an SSL certificate authority file.
404     type: string
405   SwiftHashSuffix:
406     default: unset
407     description: A random string to be used as a salt when hashing to determine mappings in the ring.
408     type: string
409     hidden: true
410   SwiftPassword:
411     default: unset
412     description: The password for the swift service account, used by the swift proxy services.
413     type: string
414     hidden: true
415   SwiftMountCheck:
416     default: 'false'
417     description: Value of mount_check in Swift account/container/object -server.conf
418     type: boolean
419   SwiftMinPartHours:
420     type: number
421     default: 1
422     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
423   SwiftPartPower:
424     default: 10
425     description: Partition Power to use when building Swift rings
426     type: number
427   SwiftReplicas:
428     type: number
429     default: 3
430     description: How many replicas to use in the swift rings.
431
432 # Compute-specific params
433   CeilometerComputeAgent:
434     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
435     type: string
436     default: ''
437     constraints:
438     - allowed_values: ['', Present]
439   ComputeCount:
440     type: number
441     default: 1
442   HypervisorNeutronPhysicalBridge:
443     default: 'br-ex'
444     description: >
445       An OVS bridge to create on each hypervisor. This defaults to br-ex the
446       same as the control plane nodes, as we have a uniform configuration of
447       the openvswitch agent. Typically should not need to be changed.
448     type: string
449   HypervisorNeutronPublicInterface:
450     default: nic1
451     description: What interface to add to the HypervisorNeutronPhysicalBridge.
452     type: string
453   NeutronNetworkVLANRanges:
454     default: 'datacentre'
455     description: >
456       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
457       Neutron documentation for permitted values. Defaults to permitting any
458       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
459     type: comma_delimited_list
460   NovaComputeDriver:
461     type: string
462     default: libvirt.LibvirtDriver
463   NovaComputeExtraConfig:
464     default: {}
465     description: |
466       NovaCompute specific configuration to inject into the cluster. Same
467       structure as ExtraConfig.
468     type: json
469   NovaComputeLibvirtType:
470     default: ''
471     type: string
472   NovaEnableRbdBackend:
473     default: false
474     description: Whether to enable or not the Rbd backend for Nova
475     type: boolean
476   NovaImage:
477     type: string
478     default: overcloud-compute
479     constraints:
480       - custom_constraint: glance.image
481   OvercloudComputeFlavor:
482     description: Use this flavor
483     type: string
484     constraints:
485       - custom_constraint: nova.flavor
486   ServiceNetMap:
487     default:
488       NeutronLocalIp: tenant
489       CeilometerApiNetwork: internal_api
490       MongoDbNetwork: internal_api
491       CinderApiNetwork: internal_api
492       CinderIscsiNetwork: storage
493       GlanceApiNetwork: storage
494       GlanceRegistryNetwork: internal_api
495       KeystoneAdminApiNetwork: internal_api
496       KeystonePublicApiNetwork: internal_api
497       NeutronApiNetwork: internal_api
498       HeatApiNetwork: internal_api
499       NovaApiNetwork: internal_api
500       NovaMetadataNetwork: internal_api
501       NovaVncProxyNetwork: internal_api
502       SwiftMgmtNetwork: storage_mgmt
503       SwiftProxyNetwork: storage
504       HorizonNetwork: internal_api
505       MemcachedNetwork: internal_api
506       RabbitMqNetwork: internal_api
507       RedisNetwork: internal_api
508       MysqlNetwork: internal_api
509       CephClusterNetwork: storage_mgmt
510       CephPublicNetwork: storage
511     description: Mapping of service_name -> network name. Typically set
512                  via parameter_defaults in the resource registry.
513     type: json
514
515 # Block storage specific parameters
516   BlockStorageCount:
517     type: number
518     default: 0
519   BlockStorageImage:
520     default: overcloud-cinder-volume
521     type: string
522   OvercloudBlockStorageFlavor:
523     description: Flavor for block storage nodes to request when deploying.
524     type: string
525     constraints:
526       - custom_constraint: nova.flavor
527
528 # Object storage specific parameters
529   ObjectStorageCount:
530     type: number
531     default: 0
532   OvercloudSwiftStorageFlavor:
533     description: Flavor for Swift storage nodes to request when deploying.
534     type: string
535     constraints:
536       - custom_constraint: nova.flavor
537   SwiftStorageImage:
538     default: overcloud-swift-storage
539     type: string
540
541 # Ceph storage specific parameters
542   CephStorageCount:
543     type: number
544     default: 0
545   CephStorageImage:
546     default: overcloud-ceph-storage
547     type: string
548   OvercloudCephStorageFlavor:
549     default: baremetal
550     description: Flavor for Ceph storage nodes to request when deploying.
551     type: string
552     constraints:
553       - custom_constraint: nova.flavor
554
555   # Hostname format for each role
556   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
557   # and %stackname% is replaced with OS::stack_name in the template below.
558   # If you want to use the heat generated names, pass '' (empty string).
559   ControllerHostnameFormat:
560     type: string
561     description: Format for Controller node hostnames
562     default: '%stackname%-controller-%index%'
563   ComputeHostnameFormat:
564     type: string
565     description: Format for Compute node hostnames
566     default: '%stackname%-novacompute-%index%'
567   BlockStorageHostnameFormat:
568     type: string
569     description: Format for BlockStorage node hostnames
570     default: '%stackname%-blockstorage-%index%'
571   ObjectStorageHostnameFormat:
572     type: string
573     description: Format for SwiftStorage node hostnames
574     default: '%stackname%-objectstorage-%index%'
575   CephStorageHostnameFormat:
576     type: string
577     description: Format for CephStorage node hostnames
578     default: '%stackname%-cephstorage-%index%'
579
580   # Identifiers to trigger tasks on nodes
581   UpdateIdentifier:
582     default: ''
583     type: string
584     description: >
585       Setting to a previously unused value during stack-update will trigger
586       package update on all nodes
587
588
589
590 resources:
591
592   HeatAuthEncryptionKey:
593     type: OS::Heat::RandomString
594
595   PcsdPassword:
596     type: OS::Heat::RandomString
597     properties:
598       length: 16
599
600   HorizonSecret:
601     type: OS::Heat::RandomString
602     properties:
603       length: 10
604
605   Controller:
606     type: OS::Heat::ResourceGroup
607     depends_on: Networks
608     properties:
609       count: {get_param: ControllerCount}
610       resource_def:
611         type: OS::TripleO::Controller
612         properties:
613           AdminPassword: {get_param: AdminPassword}
614           AdminToken: {get_param: AdminToken}
615           CeilometerBackend: {get_param: CeilometerBackend}
616           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
617           CeilometerPassword: {get_param: CeilometerPassword}
618           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
619           CinderPassword: {get_param: CinderPassword}
620           CinderISCSIHelper: {get_param: CinderISCSIHelper}
621           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
622           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
623           CloudName: {get_param: CloudName}
624           ControlVirtualInterface: {get_param: ControlVirtualInterface}
625           ControllerExtraConfig: {get_param: controllerExtraConfig}
626           Debug: {get_param: Debug}
627           EnableGalera: {get_param: EnableGalera}
628           EnableCephStorage: {get_param: ControllerEnableCephStorage}
629           EnableSwiftStorage: {get_param: ControllerEnableSwiftStorage}
630           ExtraConfig: {get_param: ExtraConfig}
631           Flavor: {get_param: OvercloudControlFlavor}
632           GlancePort: {get_param: GlancePort}
633           GlanceProtocol: {get_param: GlanceProtocol}
634           GlancePassword: {get_param: GlancePassword}
635           GlanceBackend: {get_param: GlanceBackend}
636           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
637           GlanceLogFile: {get_param: GlanceLogFile}
638           HeatPassword: {get_param: HeatPassword}
639           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
640           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
641           HorizonSecret: {get_resource: HorizonSecret}
642           Image: {get_param: controllerImage}
643           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
644           KeyName: {get_param: KeyName}
645           KeystoneCACertificate: {get_param: KeystoneCACertificate}
646           KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
647           KeystoneSigningKey: {get_param: KeystoneSigningKey}
648           KeystoneSSLCertificate: {get_param: KeystoneSSLCertificate}
649           KeystoneSSLCertificateKey: {get_param: KeystoneSSLCertificateKey}
650           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
651           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
652           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
653           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
654           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
655           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
656           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
657           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
658           NeutronPublicInterface: {get_param: NeutronPublicInterface}
659           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
660           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
661           NeutronPassword: {get_param: NeutronPassword}
662           NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
663           NeutronDVR: {get_param: NeutronDVR}
664           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
665           NeutronAgentMode: {get_param: NeutronAgentMode}
666           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
667           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
668           NeutronL3HA: {get_param: NeutronL3HA}
669           NeutronNetworkType: {get_param: NeutronNetworkType}
670           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
671           NovaPassword: {get_param: NovaPassword}
672           NtpServer: {get_param: NtpServer}
673           PcsdPassword: {get_resource: PcsdPassword}
674           PublicVirtualInterface: {get_param: PublicVirtualInterface}
675           RabbitPassword: {get_param: RabbitPassword}
676           RabbitUserName: {get_param: RabbitUserName}
677           RabbitCookie: {get_attr: [RabbitCookie, value]}
678           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
679           RabbitClientPort: {get_param: RabbitClientPort}
680           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
681           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
682           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
683           SSLCertificate: {get_param: SSLCertificate}
684           SSLKey: {get_param: SSLKey}
685           SSLCACertificate: {get_param: SSLCACertificate}
686           SwiftHashSuffix: {get_param: SwiftHashSuffix}
687           SwiftMountCheck: {get_param: SwiftMountCheck}
688           SwiftMinPartHours: {get_param: SwiftMinPartHours}
689           SwiftPartPower: {get_param: SwiftPartPower}
690           SwiftPassword: {get_param: SwiftPassword}
691           SwiftReplicas: { get_param: SwiftReplicas}
692           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
693           PublicVirtualIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
694           ServiceNetMap: {get_param: ServiceNetMap}
695           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
696           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
697           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
698           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
699           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
700           UpdateIdentifier: {get_param: UpdateIdentifier}
701           Hostname:
702             str_replace:
703               template: {get_param: ControllerHostnameFormat}
704               params:
705                 '%stackname%': {get_param: 'OS::stack_name'}
706
707   Compute:
708     type: OS::Heat::ResourceGroup
709     depends_on: Networks
710     properties:
711       count: {get_param: ComputeCount}
712       resource_def:
713         type: OS::TripleO::Compute
714         properties:
715           AdminPassword: {get_param: AdminPassword}
716           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
717           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
718           CeilometerPassword: {get_param: CeilometerPassword}
719           Debug: {get_param: Debug}
720           ExtraConfig: {get_param: ExtraConfig}
721           Flavor: {get_param: OvercloudComputeFlavor}
722           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
723           GlancePort: {get_param: GlancePort}
724           GlanceProtocol: {get_param: GlanceProtocol}
725           Image: {get_param: NovaImage}
726           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
727           KeyName: {get_param: KeyName}
728           KeystoneHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
729           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
730           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
731           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
732           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
733           NeutronNetworkType: {get_param: NeutronNetworkType}
734           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
735           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
736           NeutronPassword: {get_param: NeutronPassword}
737           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
738           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
739           NeutronDVR: {get_param: NeutronDVR}
740           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
741           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
742           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
743           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
744           # L3 HA and Failover is not relevant for Computes, should be removed
745           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
746           NeutronL3HA: {get_param: NeutronL3HA}
747           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
748           NovaComputeDriver: {get_param: NovaComputeDriver}
749           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
750           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
751           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
752           NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
753           NovaPassword: {get_param: NovaPassword}
754           NtpServer: {get_param: NtpServer}
755           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
756           RabbitPassword: {get_param: RabbitPassword}
757           RabbitUserName: {get_param: RabbitUserName}
758           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
759           RabbitClientPort: {get_param: RabbitClientPort}
760           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
761           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
762           ServiceNetMap: {get_param: ServiceNetMap}
763           UpdateIdentifier: {get_param: UpdateIdentifier}
764           Hostname:
765             str_replace:
766               template: {get_param: ComputeHostnameFormat}
767               params:
768                 '%stackname%': {get_param: 'OS::stack_name'}
769
770   BlockStorage:
771     type: OS::Heat::ResourceGroup
772     depends_on: Networks
773     properties:
774       count: {get_param: BlockStorageCount}
775       resource_def:
776         type: OS::TripleO::BlockStorage
777         properties:
778           Debug: {get_param: Debug}
779           Image: {get_param: BlockStorageImage}
780           CinderISCSIHelper: {get_param: CinderISCSIHelper}
781           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
782           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
783           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
784           CinderPassword: {get_param: CinderPassword}
785           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
786           KeyName: {get_param: KeyName}
787           Flavor: {get_param: OvercloudBlockStorageFlavor}
788           RabbitPassword: {get_param: RabbitPassword}
789           RabbitUserName: {get_param: RabbitUserName}
790           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
791           RabbitClientPort: {get_param: RabbitClientPort}
792           NtpServer: {get_param: NtpServer}
793           UpdateIdentifier: {get_param: UpdateIdentifier}
794           Hostname:
795             str_replace:
796               template: {get_param: BlockStorageHostnameFormat}
797               params:
798                 '%stackname%': {get_param: 'OS::stack_name'}
799
800   ObjectStorage:
801     type: OS::Heat::ResourceGroup
802     depends_on: Networks
803     properties:
804       count: {get_param: ObjectStorageCount}
805       resource_def:
806         type: OS::TripleO::ObjectStorage
807         properties:
808           KeyName: {get_param: KeyName}
809           Flavor: {get_param: OvercloudSwiftStorageFlavor}
810           HashSuffix: {get_param: SwiftHashSuffix}
811           MountCheck: {get_param: SwiftMountCheck}
812           MinPartHours: {get_param: SwiftMinPartHours}
813           PartPower: {get_param: SwiftPartPower}
814           Image: {get_param: SwiftStorageImage}
815           Replicas: { get_param: SwiftReplicas}
816           NtpServer: {get_param: NtpServer}
817           UpdateIdentifier: {get_param: UpdateIdentifier}
818           ServiceNetMap: {get_param: ServiceNetMap}
819           Hostname:
820             str_replace:
821               template: {get_param: ObjectStorageHostnameFormat}
822               params:
823                 '%stackname%': {get_param: 'OS::stack_name'}
824
825   CephStorage:
826     type: OS::Heat::ResourceGroup
827     depends_on: Networks
828     properties:
829       count: {get_param: CephStorageCount}
830       resource_def:
831         type: OS::TripleO::CephStorage
832         properties:
833           Image: {get_param: CephStorageImage}
834           KeyName: {get_param: KeyName}
835           Flavor: {get_param: OvercloudCephStorageFlavor}
836           NtpServer: {get_param: NtpServer}
837           ServiceNetMap: {get_param: ServiceNetMap}
838           UpdateIdentifier: {get_param: UpdateIdentifier}
839           Hostname:
840             str_replace:
841               template: {get_param: CephStorageHostnameFormat}
842               params:
843                 '%stackname%': {get_param: 'OS::stack_name'}
844
845   ControllerIpListMap:
846     type: OS::TripleO::Network::Ports::NetIpListMap
847     properties:
848       ExternalIpList: {get_attr: [Controller, external_ip_address]}
849       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
850       StorageIpList: {get_attr: [Controller, storage_ip_address]}
851       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
852       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
853
854   allNodesConfig:
855     type: OS::TripleO::AllNodes::SoftwareConfig
856     properties:
857       compute_hosts: {get_attr: [Compute, hosts_entry]}
858       controller_hosts: {get_attr: [Controller, hosts_entry]}
859       controller_ips: {get_attr: [Controller, ip_address]}
860       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
861       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
862       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
863       controller_names: {get_attr: [Controller, hostname]}
864       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
865       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
866       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
867       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
868       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
869       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
870       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
871       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
872       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
873       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
874       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
875       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
876       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
877       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
878       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
879       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
880       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
881
882   MysqlRootPassword:
883     type: OS::Heat::RandomString
884     properties:
885       length: 10
886
887   MysqlClusterUniquePart:
888     type: OS::Heat::RandomString
889     properties:
890       length: 10
891
892   RabbitCookie:
893     type: OS::Heat::RandomString
894     properties:
895       length: 20
896       salt: {get_param: RabbitCookieSalt}
897
898   # creates the network architecture
899   Networks:
900     type: OS::TripleO::Network
901
902   ControlVirtualIP:
903     type: OS::Neutron::Port
904     depends_on: Networks
905     properties:
906       name: control_virtual_ip
907       network_id: {get_param: NeutronControlPlaneID}
908       fixed_ips: {get_param: ControlFixedIPs}
909       replacement_policy: AUTO
910
911   RedisVirtualIP:
912     depends_on: Networks
913     type: OS::TripleO::Controller::Ports::RedisVipPort
914     properties:
915       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
916       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
917       PortName: redis_virtual_ip
918       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
919
920   # same as external
921   PublicVirtualIP:
922     type: OS::Neutron::Port
923     depends_on: Networks
924     properties:
925       name: public_virtual_ip
926       network: {get_param: PublicVirtualNetwork}
927       fixed_ips: {get_param: PublicVirtualFixedIPs}
928       replacement_policy: AUTO
929
930   InternalApiVirtualIP:
931     depends_on: Networks
932     type: OS::TripleO::Controller::Ports::InternalApiPort
933     properties:
934       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
935       PortName: internal_api_virtual_ip
936
937   StorageVirtualIP:
938     depends_on: Networks
939     type: OS::TripleO::Controller::Ports::StoragePort
940     properties:
941       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
942       PortName: storage_virtual_ip
943
944   StorageMgmtVirtualIP:
945     depends_on: Networks
946     type: OS::TripleO::Controller::Ports::StorageMgmtPort
947     properties:
948       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
949       PortName: storage_management_virtual_ip
950
951   VipMap:
952     type: OS::TripleO::Network::Ports::NetIpMap
953     properties:
954       ExternalIp: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
955       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
956       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
957       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
958       # No tenant VIP required
959
960   VipConfig:
961     type: OS::TripleO::VipConfig
962
963   VipDeployment:
964     type: OS::Heat::StructuredDeployments
965     properties:
966       config: {get_resource: VipConfig}
967       servers: {get_attr: [Controller, attributes, nova_server_resource]}
968       input_values:
969         # service VIP mappings
970         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
971         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
972         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
973         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
974         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
975         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
976         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
977         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
978         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
979         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
980         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
981         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
982         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
983         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
984         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
985         # direct configuration of Virtual IPs for each network
986         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
987         public_virtual_ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
988         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
989         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
990         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
991
992   ControllerBootstrapNodeConfig:
993     type: OS::TripleO::BootstrapNode::SoftwareConfig
994     properties:
995       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
996       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
997
998   ControllerBootstrapNodeDeployment:
999     type: OS::Heat::StructuredDeployments
1000     properties:
1001       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1002       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1003
1004   ControllerSwiftDeployment:
1005     type: OS::Heat::StructuredDeployments
1006     properties:
1007       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1008       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1009
1010   ObjectStorageSwiftDeployment:
1011     type: OS::Heat::StructuredDeployments
1012     properties:
1013       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1014       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1015
1016   SwiftDevicesAndProxyConfig:
1017     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1018     properties:
1019       controller_swift_devices: {get_attr: [Controller, swift_device]}
1020       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1021       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1022
1023   ComputeCephDeployment:
1024     type: OS::Heat::StructuredDeployments
1025     properties:
1026       config: {get_attr: [CephClusterConfig, config_id]}
1027       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1028
1029   ControllerCephDeployment:
1030     type: OS::Heat::StructuredDeployments
1031     properties:
1032       config: {get_attr: [CephClusterConfig, config_id]}
1033       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1034
1035   CephStorageCephDeployment:
1036     type: OS::Heat::StructuredDeployments
1037     properties:
1038       config: {get_attr: [CephClusterConfig, config_id]}
1039       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1040
1041   CephClusterConfig:
1042     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1043     properties:
1044       ceph_fsid: {get_param: CephClusterFSID}
1045       ceph_mon_key: {get_param: CephMonKey}
1046       ceph_admin_key: {get_param: CephAdminKey}
1047       ceph_mon_names: {get_attr: [Controller, hostname]}
1048       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1049
1050   ControllerClusterConfig:
1051     type: OS::Heat::StructuredConfig
1052     properties:
1053       group: os-apply-config
1054       config:
1055         corosync:
1056           nodes: {get_attr: [Controller, corosync_node]}
1057         horizon:
1058           caches:
1059             memcached:
1060               nodes: {get_attr: [Controller, hostname]}
1061         mysql:
1062           nodes: {get_attr: [Controller, corosync_node]}
1063         haproxy:
1064           nodes: {get_attr: [Controller, corosync_node]}
1065
1066   ControllerClusterDeployment:
1067     type: OS::Heat::StructuredDeployments
1068     properties:
1069       config: {get_resource: ControllerClusterConfig}
1070       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1071
1072   ControllerAllNodesDeployment:
1073     type: OS::Heat::StructuredDeployments
1074     properties:
1075       config: {get_attr: [allNodesConfig, config_id]}
1076       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1077
1078   ComputeAllNodesDeployment:
1079     type: OS::Heat::StructuredDeployments
1080     properties:
1081       config: {get_attr: [allNodesConfig, config_id]}
1082       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1083
1084   BlockStorageAllNodesDeployment:
1085     type: OS::Heat::StructuredDeployments
1086     properties:
1087       config: {get_attr: [allNodesConfig, config_id]}
1088       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1089
1090   ObjectStorageAllNodesDeployment:
1091     type: OS::Heat::StructuredDeployments
1092     properties:
1093       config: {get_attr: [allNodesConfig, config_id]}
1094       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1095
1096   CephStorageAllNodesDeployment:
1097     type: OS::Heat::StructuredDeployments
1098     properties:
1099       config: {get_attr: [allNodesConfig, config_id]}
1100       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1101
1102   # Nested stack deployment runs after all other controller deployments
1103   ControllerNodesPostDeployment:
1104     type: OS::TripleO::ControllerPostDeployment
1105     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1106     properties:
1107       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1108
1109   ComputeNodesPostDeployment:
1110     type: OS::TripleO::ComputePostDeployment
1111     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1112     properties:
1113       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1114
1115   ObjectStorageNodesPostDeployment:
1116     type: OS::TripleO::ObjectStoragePostDeployment
1117     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1118     properties:
1119       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1120
1121   BlockStorageNodesPostDeployment:
1122     type: OS::TripleO::BlockStoragePostDeployment
1123     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1124     properties:
1125       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1126
1127   CephStorageNodesPostDeployment:
1128     type: OS::TripleO::CephStoragePostDeployment
1129     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1130     properties:
1131       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1132
1133 outputs:
1134   KeystoneURL:
1135     description: URL for the Overcloud Keystone service
1136     value:
1137       list_join:
1138       - ''
1139       - - http://
1140         - {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1141         - :5000/v2.0/