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