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