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